4

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

int x = -4 , y = 5 ;
bool result = x > 0 && y++ < 10 ;

表达式 (x > 0) 将首先被评估,因为 (x > 0 = false) 和由于短路评估,另一个表达式 (y++ < 10) 不会被评估并且 y 的值将保持 5 .

现在考虑以下代码:

int x = -4 , y = 5 ;
bool result = (x > 0) && (y++ < 10) ;

预计括号中的表达式将首先被评估,以便在执行逻辑与之前,表达式 (y++ < 10) 将被评估并且 y 的值已变为 6 ,但实际情况是 y 的值仍然是 5 。这意味着即使有括号,评估也会被短路并且表达式 (y++ < 10) 被忽略。

这个案子的解释是什么?!

4

3 回答 3

10

解释在问题中 -短路

在 C++ 中,&&(以及||就此而言)的评估保证是从左到右的,并且一旦false遇到 a (分别true||),评估就保证停止。

我猜Java类似。

括号是多余的,在这种情况下不相关 - 它与运算符优先级无关。它只是与如何&&工作有关:

其实这两个版本

x > 0 && y++ < 10
(x > 0) && (y++ < 10)

是等价的,因为++优先级最高,其次是<,>,最后是&&。迂腐地,你应该把它写成:

(x > 0) && ((y++) < 10)

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

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

于 2012-10-10T21:56:17.753 回答
1

When the left side determines the result, the right side is not evaluated.

In the first case, the right side is y++ < 10, and this is not evaluated. In the second case, the right side is (y++ < 10), and this is not evaluated.

There is no rule that expressions in parentheses are evaluated first. Parentheses only group operands.

于 2012-10-10T21:57:37.047 回答
0

Even with parentheses short-circuiting must still take place. Consider if you have an expression involving pointers:

int* ptr = 0;
int bar = 5;
bool result = (ptr != 0) && (*ptr == bar || bar > 10);

You clearly can't safely evaluate the right-hand side of the && there, but the parentheses are required to make the precedence work as intended. The parentheses simply determine the order of operations that are actually performed not that they happen in a particular order.

于 2012-10-10T22:00:08.537 回答