2011-09-29 80 views
5

碰到一些使用了这个代码的代码,这让我很想知道。C++:作为条件语句的逻辑比较?

if(condition) foo = bar(); 

condition && (foo = bar()); 

这两段代码是否等于编译器?如果不是,他们在哪些方面会有所不同?

+0

这样的技术在这里使用:[在不使用条件语句和三元运算符的情况下,在C中查找最多三个数字(http://stackoverflow.com/questions/7074010/find-maximum-of-three-number-in- c-without-using-conditional-statement-and-ternary) – Nawaz

+0

Nawaz - 这样一个无用的家庭作业的优雅解决方案。 :P –

回答

1

除非&&目前超载的类型conditionfoo组合,他们将有相同的行为 - 后者会以这种方式工作:

bool result; 
if(!condition) { 
    result = false; 
} else { 
    foo = bar(); 
    result = foo != 0; 
} 
and result gets ignored 

这是通常的短路 - 如果&&第一部分是false第二个是没有评估。

IMO第二个变体的可读性要差得多。

6

由于操作者precendence,后者被解释为:

(condition && foo) = bar(); 

另外,存在过载的&&的可能性,这可能导致相当多的东西。

简而言之:它们根本不相等 - 至少在一般情况下。

+0

啊,你是对的!这是我的错误,尽管括号出现在我看到的代码中。修正了问题 –

1

除非condition && foo评估为左值,condition && foo = bar();是没有意义的。

+0

对不起,我忽略了包括括号,它已被更正。用新代码代替 –

0

存在编译器错误:无效的l值。要具有相同的功能,您必须使用

conticion ? foo = bar() : <other accion>; 
+0

,它具有相同的含义 –

2

第一个版本只是一个普通的旧语句。

第二个版本是一个表达式,它将返回整个表达式的结果。这可能允许一些棘手的单行语法,像往常一样,可能会使代码更具可读性,但由于陌生性,更可能使其更加复杂和更难以快速解析。

国际海事组织无论在任何地方一直使用它,以便您的代码的读者习惯它,或根本不使用它。

0

如果& &未过载为既不条件也不FOO:

condition && (foo = bar()); 

将被视为

(condition.operator bool()) && (foo = bar()); 

如果(condition.operator布尔())是不正确的,(FOO = bar())将不会被执行,反之亦然。