括号和逻辑运算符

m0s*_*afa 4 c++ java short-circuiting logical-operators

考虑这段代码(C++):

int x = -4 , y = 5 ;
bool result = x > 0 && y++ < 10 ;
Run Code Online (Sandbox Code Playgroud)

表达式(X> 0)将被首先计算,并且因为(X> 0 =假),并且由于短路评价,其他表达(Y ++ <10)将不会被评价和y的值将保持5 .

现在考虑以下代码:

int x = -4 , y = 5 ;
bool result = (x > 0) && (y++ < 10) ;
Run Code Online (Sandbox Code Playgroud)

可以预期,在括号中的表达式将被首先计算,使得逻辑AND被执行时,表达之前(Y ++ <10)将已被评估和y的值已成为6,但现实情况是,y的值仍然是5.这意味着即使使用括号,评估也会被短路,并且忽略表达式(y ++ <10).

这个案子有什么解释?

Luc*_*ore 10

解释是在问题 - 短路.

在C++中,&&(以及||对于此问题)的评估保证是从左到右,并且一旦false遇到(分别true||),就保证评估停止.

类似于Java我猜.

括号是冗余的,在这种情况下不相关 - 它与运算符优先级无关.它只与&&工作方式有关:

实际上,这两个版本

x > 0 && y++ < 10
(x > 0) && (y++ < 10)
Run Code Online (Sandbox Code Playgroud)

是等价的,因为它++具有最高的优先级,其次是<,>,最后&&.小心翼翼,你应该把它写成:

(x > 0) && ((y++) < 10)
Run Code Online (Sandbox Code Playgroud)

5.14逻辑AND运算符[expr.log.and]

1 &&操作员从左到右分组.操作数都隐式转换为bool类型(第4节).如果两个操作数都是true,false则结果为真.与&不同,&&保证从左到右的评估:如果第一个操作数是,则不评估第二个操作数false.(强调我的)