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

时间:2017-02-06 14:35:06

标签: c++ while-loop variable-assignment

我在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

2 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:0)

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

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

输出为0.试一试。

在表达式x++ && x < 5中,x++的值为0,0表示为false。它是&&运算符的左侧,因为它是错误的,所以右侧不会被评估;表达式的值为false。试试吧。

其他示例都增加了x的值,因此在测试中,x的值为1,true被视为&&运算符。这是第一个示例中的x++与第二个和第三个中的x += 1以及x = x + 1之间的差异。要使第一个行为与其他行为相同,请将其更改为++x && x < 5。在这种情况下,++x递增x,表达式的值是递增的结果。所以用

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

输出为1.尝试一下。