【发布时间】:2011-11-27 13:31:33
【问题描述】:
遇到了一些使用它的代码,这让我感到疑惑。
if(condition) foo = bar();
condition && (foo = bar());
这两段代码是否等同于编译器?如果不是,它们会在哪些方面有所不同?
【问题讨论】:
-
Nawaz - 这样一个无用的家庭作业的优雅解决方案。 :P
标签: c++ obfuscation
遇到了一些使用它的代码,这让我感到疑惑。
if(condition) foo = bar();
condition && (foo = bar());
这两段代码是否等同于编译器?如果不是,它们会在哪些方面有所不同?
【问题讨论】:
标签: c++ obfuscation
由于运算符优先级,后者被解释为:
(condition && foo) = bar();
此外,&& 有可能被超载,这可能导致几乎任何事情。
简而言之:它们根本不相等——至少在一般情况下是这样。
【讨论】:
除非 condition && foo 评估为 左值 ,否则 condition && foo = bar(); 是没有意义的。
【讨论】:
存在编译器错误:左值无效。要拥有相同的功能,您必须使用
conticion ? foo = bar( ) : <other accion>;
【讨论】:
第一个版本只是一个简单的旧声明。
第二个版本是一个表达式,它将返回整个表达式的结果。这可能会允许一些棘手的单行语法,像往常一样,这可能会使代码更具可读性,但更有可能由于不熟悉而使其更复杂且更难快速解析。
IMO 要么在任何地方始终如一地使用它,以便代码的读者习惯它,要么根本不使用它。
【讨论】:
除非&& 为condition 和foo 类型的组合而重载,否则它们将具有相同的行为 - 后者将以这种方式工作:
bool result;
if( !condition ) {
result = false;
} else {
foo = bar();
result = foo != 0;
}
and result gets ignored
这是通常的短路 - 如果&& 的第一个组件是false,则第二个组件不会被评估。
IMO 第二种变体的可读性要差得多。
【讨论】:
如果 && 对于条件和 foo 都没有重载:
condition && (foo = bar());
将被视为
(condition.operator bool()) && (foo = bar());
如果 (condition.operator bool()) 不成立,则 (foo = bar()) 不会被执行,反之亦然。
【讨论】: