碰到一些使用了这个代码的代码,这让我很想知道。C++:作为条件语句的逻辑比较?
if(condition) foo = bar();
condition && (foo = bar());
这两段代码是否等于编译器?如果不是,他们在哪些方面会有所不同?
碰到一些使用了这个代码的代码,这让我很想知道。C++:作为条件语句的逻辑比较?
if(condition) foo = bar();
condition && (foo = bar());
这两段代码是否等于编译器?如果不是,他们在哪些方面会有所不同?
除非&&
目前超载的类型condition
和foo
组合,他们将有相同的行为 - 后者会以这种方式工作:
bool result;
if(!condition) {
result = false;
} else {
foo = bar();
result = foo != 0;
}
and result gets ignored
这是通常的短路 - 如果&&
第一部分是false
第二个是没有评估。
IMO第二个变体的可读性要差得多。
由于操作者precendence,后者被解释为:
(condition && foo) = bar();
另外,存在过载的&&
的可能性,这可能导致相当多的东西。
简而言之:它们根本不相等 - 至少在一般情况下。
啊,你是对的!这是我的错误,尽管括号出现在我看到的代码中。修正了问题 –
除非condition && foo
评估为左值,condition && foo = bar();
是没有意义的。
对不起,我忽略了包括括号,它已被更正。用新代码代替 –
存在编译器错误:无效的l值。要具有相同的功能,您必须使用
conticion ? foo = bar() : <other accion>;
,它具有相同的含义 –
第一个版本只是一个普通的旧语句。
第二个版本是一个表达式,它将返回整个表达式的结果。这可能允许一些棘手的单行语法,像往常一样,可能会使代码更具可读性,但由于陌生性,更可能使其更加复杂和更难以快速解析。
国际海事组织无论在任何地方一直使用它,以便您的代码的读者习惯它,或根本不使用它。
如果& &未过载为既不条件也不FOO:
condition && (foo = bar());
将被视为
(condition.operator bool()) && (foo = bar());
如果(condition.operator布尔())是不正确的,(FOO = bar())将不会被执行,反之亦然。
这样的技术在这里使用:[在不使用条件语句和三元运算符的情况下,在C中查找最多三个数字(http://stackoverflow.com/questions/7074010/find-maximum-of-three-number-in- c-without-using-conditional-statement-and-ternary) – Nawaz
Nawaz - 这样一个无用的家庭作业的优雅解决方案。 :P –