3

对于C++03,标准规定, && 运算符的左右操作数之间存在一个序列点,因此在访问右运算符之前,左运算符的所有副作用都已发生。

所以

int i = 0;
if (++i && i--)
    std::cout << i;

定义明确,保证输出0

但是这个问题是怎么回事:只有当左操作数不是时才评估右操作数0?这似乎是一个细节,但对我来说,标准只保证操作数之间的序列点,而不是右操作数永远不会根据左操作数进行评估/访问

例如

int arr[10];
int pos; // somehow set to a value from 0 to 10
while (pos < 10 && arr[pos] != 0)
    pos++;

这定义好了吗?pos可能是从开始10或到达10。左操作数没有与右操作数一致的副作用。我有arr[10] != 0永不履行的保证吗?

编辑:

感谢评论和答案,现在很清楚:

5.14p2: "The result is a bool. If the second expression is evaluated,
every value computation and side effect associated with the first expression
is sequenced before every value computation and side effect associated with
the second expression."

是序列点的含义。

5.14p1: "Unlike &, && guarantees left-to-right evaluation: the second operand is
not evaluated if the first operand is false."

是短路的意思。

第一个没有第二个将使我的示例未定义。谢谢。

4

2 回答 2

8

The standard does guarantee short-circuiting of && and ||.

If the left-hand side of && is false, the right-hand side is not evaluated. For ||, the right-hand side is not evaluated if the left-hand side is true.

于 2014-01-20T16:16:32.440 回答
5

C++11的5.14p1,最后一句:

与 & 不同,&& 保证从左到右的评估:如果第一个操作数为假,则不评估第二个操作数。

所以是的,这是有保证的。

于 2014-01-20T16:17:07.897 回答