可能是重复问题:
C/C++中是否强制使用短路布尔运算符?以及评估顺序?
是否存在由标准或数学规则定义的布尔语句求值顺序? 例如:
if (firstTrue && secondTrue)
{
}
我能确定firstTrue会首先被检查吗?
可能是重复问题:
C/C++中是否强制使用短路布尔运算符?以及评估顺序?
是否存在由标准或数学规则定义的布尔语句求值顺序? 例如:
if (firstTrue && secondTrue)
{
}
我能确定firstTrue会首先被检查吗?
&&
和 ||
是 短路运算符。操作数的求值顺序已经很明确定义(从左到右)。
&&
也是一个序列点。if( ++i && i) { }
是完全可以的。5.14/1
) 表示:
编辑:(在看到评论后)&& 运算符按从左到右的顺序进行分组。两个操作数都隐式转换为类型 bool (第 4 条)。如果两个操作数都为 true,则结果为 true,否则为 false。与 & 不同,&& 保证左到右的求值:如果第一个操作数为 false,则不会对第二个操作数进行求值。
1.9/18
) 表示
在每个表达式的求值中
a && b
a || b
a ? b : c
a , b
使用这些表达式中运算符的内置含义 (5.14、5.15、5.16、5.18),在第一个表达式求值之后有一个序列点。
是的,先评估firstTrue表达式。实际上,如果firstTrue为false,则不会评估secondTrue表达式。这被称为短路运算。
请查看此文章:http://en.wikipedia.org/wiki/Short-circuit_evaluation
对于||也是一样的。如果||的第一个参数为true,则不会评估第二个参数。
这不是关于布尔语句的问题,而是关于这些“语句”中特定的运算符(实际上是逻辑表达式)
内置的&&
运算符(以及||
)是特殊的:它们保证左侧在右侧之前被评估。它们在LHS和RHS评估之间有一个序列点。如果LHS预先确定了结果,则它们不会评估RHS。除此之外(和一些具有类似排序属性的其他运算符),没有任何关于逻辑表达式或任何其他表达式的评估顺序的保证。
以上内容适用于内置的&&
和||
运算符。重载的&&
和||
运算符在任何方面都不是特殊的。
&&
符号。 - David Rodríguez - dribeas