为什么 while 循环的条件表达式中赋值操作的行为不同? (CPP)
Why is the behavior of assignment operation in while loop's conditional expression different? (CPP)
我在 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
您的困惑源于缺少括号。您的表达式按顺序等同于以下内容:
(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 += 1
和 x = x + 1
之间的区别。要使第一个行为与其他行为相同,请将其更改为 ++x && x < 5
。在那种情况下,++x
递增 x
,并且表达式的值是递增的结果。所以用
int x = 0;
std::cout << ++x << '\n';
输出将是1。试试吧。
我在 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
您的困惑源于缺少括号。您的表达式按顺序等同于以下内容:
(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 += 1
和 x = x + 1
之间的区别。要使第一个行为与其他行为相同,请将其更改为 ++x && x < 5
。在那种情况下,++x
递增 x
,并且表达式的值是递增的结果。所以用
int x = 0;
std::cout << ++x << '\n';
输出将是1。试试吧。