C ++:作为条件语句的逻辑比较?

时间:2011-09-29 09:38:19

标签: c++ obfuscation

使用了一些使用它的代码,这让我想知道。

if(condition) foo = bar();

condition && (foo = bar());

这两段代码是否等同于编译器?如果不是,它们会以何种方式不同?

6 个答案:

答案 0 :(得分:6)

由于操作员优先权,后者被解释为:

(condition && foo) = bar();

此外,&&可能会超载,这可能导致几乎任何事情。

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

答案 1 :(得分:2)

第一个版本只是一个简单的陈述。

第二个版本是一个表达式,它将返回整个表达式的结果。这可能允许一些棘手的单行语法,按照惯例,可能会使代码更具可读性,但由于不熟悉,更有可能使代码变得更复杂,更难以快速解析。

IMO要么始终如一地使用它,以便您的代码的读者习惯它,或者根本不使用它。

答案 2 :(得分:1)

除非condition && foo评估为左值,否则condition && foo = bar();毫无意义。

答案 3 :(得分:1)

除非为&&condition类型的组合重载foo,否则它们将具有相同的行为 - 后者将以这种方式工作:

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

通常是短路 - 如果&&的第一个成分是false,则第二个成分不会被评估。

IMO第二种变体的可读性要低得多。

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

如果&amp;&amp;既不是条件也不是foo:

condition && (foo = bar());

将被视为

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

如果(condition.operator bool())不为真,则不执行(foo = bar()),反之亦然。