为什么 while 循环的条件表达式中赋值操作的行为不同? (CPP)

Why is the behavior of assignment operation in while loop's conditional expression different? (CPP)

我在 while 循环的条件中尝试了 x+=1x=x+1

x = 0 // Initial value of x

第一种情况

while(x+=1 && x < 5){
    cout << x << endl;
}

第二种情况

while(x=x+1 && x < 5){
    cout << x << endl;
}

第一种情况和第二种情况令人费解。 x+=1x=x+1 都进入无限循环(因为短路)的行为有何不同。但是第一种情况下 x 的值停留在 1.

有什么想法吗?

根据 Is x += 1 more efficient than x = x + 1?,大多数编译器(良好)优化并做完全相同的事情。

我正在使用的编译器 - gcc 版本 5.4.0

您的困惑源于缺少括号。您的表达式按顺序等同于以下内容:

(x++) && (x < 5)     // First case
x+=(1 && (x < 5))    // Second case
x=((x+1) && (x < 5)) // Third case

连同隐式转换等,这会产生您所看到的行为。

这就是为什么我们使用括号,并在编译时启用警告。

x++ 是递增 x 的表达式;它的值是 x 的旧值。所以用这个代码

int x = 0;
std::cout << x++ << 'n';

输出会是0,试试吧

在表达式x++ && x < 5中,x++的值为0,0被视为false。它是 && 运算符的 left-hand 端,因为它是 false,所以 right-hand 端不会被计算;表达式的值为 false。试试吧。

其余的例子都是自增x的值,所以在测试中,x的值为1,对于&& 运算符。这就是第一个示例中的 x++ 与第二个和第三个示例中的 x += 1x = x + 1 之间的区别。要使第一个行为与其他行为相同,请将其更改为 ++x && x < 5。在那种情况下,++x 递增 x,并且表达式的值是递增的结果。所以用

int x = 0;
std::cout << ++x << '\n';

输出将是1。试试吧。