也许是由于Perl的影响,我喜欢使用以下语法
condition && do_something();
代替
if ( condition )
{
do_something();
}
(我知道我可以不用大括号就将后者排成一排,但这不是重点。)
我已经做了几项测试(如下),可以正常工作。
但是我在标准中找不到引用,说明它是合法的。
它可能暗示
但是我不太确定(我检查了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;
}
最佳答案
这是完全合法的。来自[expr.log.and]:
expr() && fun()
等效于if (expr()) fun()
(假设fun()
返回可转换为bool
的内容)。在编写复合条件表达式时,这是一个非常重要的属性。例如,只有在知道指针是有效的之后才对其进行引用:
if (ptr && ptr->foo()) { ... }
也就是说,如果您真正想要的是:
if (expr()) {
fun();
}
只是写那个。无论哪种方式,编译器都会生成相同的代码,但是您要执行的操作的意图会更加清晰。