我在while循环条件中尝试了x+=1
,x=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+=1
和x=x+1
的行为有什么不同,它们都进入无限循环(由于短路)。但是第一种情况下x的值被固定在1。
有什么想法?
根据Is x += 1 more efficient than x = x + 1?,大多数编译器(好的)都会优化并执行完全相同的操作。
我正在使用的编译器 - gcc版本5.4.0
答案 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.尝试一下。