laf*_*blu 2 c++ expression if-statement logical-operators
可能是受 Perl 的影响,我喜欢使用下面的语法
condition && do_something();
Run Code Online (Sandbox Code Playgroud)
代替
if ( condition )
{
do_something();
}
Run Code Online (Sandbox Code Playgroud)
(我知道我可以在没有大括号的情况下将后者放在一行中,但这不是重点。)
我已经进行了几次测试(如下),这些测试有效。但是我在标准中找不到参考,说明它是合法的。它可以隐含在
但我不完全确定(我检查了 C++ 98,抱歉是老式的,但可能甚至 C 标准就足够了)。
注意:我确实意识到为了工作,最后一个表达式 (do_something) 也必须可以转换为 bool,这对于选择语句来说不是必需的。这当然是一个严重的限制。
所以问题是:
抱歉,如果结果是重复的,我找不到任何东西,但可能是因为我没有使用正确的关键字。
#include <cassert>
bool sayYes()
{
return true;
}
bool sayNo()
{
return false;
}
int main( int args, char* argv[] )
{
bool a = true;
bool b = false;
int i = 0;
a && ( i = 1 );
assert( i == 1 );
!a && ( i = 0 );
assert( i == 1 );
( a || b ) && ( i = 0 );
assert( i == 0 );
sayYes() && ( i = 1 );
assert( i == 1 );
( sayNo() || sayYes() ) && ( i = 0 );
assert( i == 0 );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是完全合法的。来自 [expr.log.and]:
&&保证从左到右的评估:如果第一个操作数是 ,则不评估第二个操作数false。
expr() && fun()等价于if (expr()) fun()(假设fun()返回可转换为 的东西bool)。在编写复合条件表达式时,这是一个极其重要的属性。例如,只有在我们知道它是有效的之后才取消引用一个指针:
if (ptr && ptr->foo()) { ... }
Run Code Online (Sandbox Code Playgroud)
也就是说,如果你真正想要的是:
if (expr()) {
fun();
}
Run Code Online (Sandbox Code Playgroud)
就这么写。无论哪种方式,编译器都会生成相同的代码,但您尝试执行的操作的意图将更加清晰。