可能重复:
Is short-circuiting boolean operators mandated in C/C++? And evaluation order?
是否有任何由标准或数学规则定义的布尔句子?例如:
if (firstTrue && secondTrue)
{
}
我可以确定首先检查firstTrue吗?
答案 0 :(得分:13)
是。 &&
和||
是short circuiting operators。操作数的评估顺序是明确定义的(从左到右)。
&&
也是一个序列点
所以写if( ++i && i) { }
完全没问题。
ISO C ++ 03(5.14/1
)说:
&&操作员组从左到右。操作数都隐式转换为bool类型(第4节)。 如果两个操作数均为true,则结果为true,否则为false。不像&,&&保证从左到右评估:如果第一个操作数为假,则不评估第二个操作数。
编辑 :(看到评论后)
ISO C ++ 03(第1.9/18
部分)说
在每个表达式的评估中
a&& b
a || b
a? b:c
a,b
使用这些表达式中的运算符的内置含义(5.14,5.15,5.16,5.18),在评估第一个表达式后有一个序列点。
答案 1 :(得分:7)
是firstTrue将首先评估。实际上,如果firstTrue为false,则甚至不会评估secondTrue。这称为短路。
查看此文章:http://en.wikipedia.org/wiki/Short-circuit_evaluation
||
也是如此。如果||
的第一个参数为真,则不会评估第二个参数。
答案 2 :(得分:2)
这不是布尔句子。它是关于这些“句子”中的特定运算符(实际上是逻辑表达式)
内置&&
运算符(以及||
)是特殊的:它们保证在右侧大小之前评估左侧。它们在LHS和RHS评估之间有一个序列点。如果结果由LHS预先确定,他们不会评估RHS。除此之外(以及其他一些具有类似排序属性的运算符),无法保证逻辑表达式或任何其他表达式的评估顺序。
以上内容适用于内置&&
和||
运算符。重载的&&
和||
运算符在任何方面都不是特殊的。