这里发生了什么?
#include <iostream>
using namespace std;
int main(){
int x=0,y=0;
true? ++x, ++y : --x, --y;
cout << "x: " << x << endl;
cout << "y: " << y << endl; //why does y=0 here?
x=0,y=0;
false ? ++x, ++y : --x, --y;
cout << "x: " << x << endl;
cout << "y: " << y << endl;
}
x: 1
y: 0
x: -1
y: -1
第二种情况似乎不错。在第一种情况下,我希望x和y都递增到1,但只有左手操作数递增。
第一个等价于:
(true ? (++x, ++y) : (--x)), --y;
第二个相当于:
(false ? (++x, ++y) : (--x)), --y;
因此CCD_ 1总是被执行。在第一行中,首先执行增量,因此预期x = 1, y = 0
。在第二行中,首先执行x
的递减,因此预期x = -1, y = -1
。
正如Barmar在评论(对另一个答案)中所指出的:
如果有人想知道为什么
++x
和++y
之间的逗号没有同样的效果,那是因为(true? ++x)
根本无效。因此,编译器会一直扫描,直到找到:
,但在此之后,当它到达优先级较低的运算符[(本例中为,
)或语句末尾]时,它就会停止。
--y
0为零,因为逗号在所有C++运算符中的优先级最低。由于其优先级低于三元条件运算符,因此条件运算符被解析为true? ++x, ++y : --x
和false? ++x, ++y : --x
。在这两种情况下,--y
语句都是无条件执行的。
EDIT第一个逗号不同,因为编译器找到了?
,所以现在需要:
来完成条件的"when true"表达式。这就是为什么++x
和++y
都被接受的原因。
阅读标准
§5.18逗号运算符[expr.Comma]
¶1逗号运算符从左到右分组。
expression: assignment-expression expression , assignment-expression
由逗号分隔的一对表达式从左到右进行求值;左边的表达式是一个discardedvalue表达(第5条)83与左表达式相关的每个值计算和副作用在每个值计算和与正确表达式相关联的副作用之前进行排序。类型结果的值是右操作数的类型和值;结果属于相同的值类别如果其右操作数是glvalue和位字段,则为位字段。
¶2在逗号具有特殊含义的情况下,[示例:函数参数列表中(5.2.2)和初始化程序列表(8.5)--结束示例]第5条中描述的逗号运算符只能出现括号中。[示例:
f(a, (t=3, t+2), c);
有三个参数,其中第二个参数的值为5--结束示例]