使用了一些使用它的代码,这让我想知道。
if(condition) foo = bar();
condition && (foo = bar());
这两段代码是否等同于编译器?如果不是,它们会以何种方式不同?
答案 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()),反之亦然。