[英]What's the precedence of comma operator inside conditional operator in C++?
这里发生了什么事?
#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;
因此--y
总是被执行。 在第一行中,首先执行增量,因此x = 1, y = 0
是预期的。 在第二行中,首先执行x
的递减,因此x = -1, y = -1
是预期的。
如果有人想知道为什么
++x
和++y
之间的逗号没有相同的效果,那是因为(true? ++x)
根本无效。 因此,编译器会一直扫描,直到找到:
,但除此之外,它会在到达较低优先级运算符[(,
在本例中) 或语句结尾] 时停止。
y
为零是因为逗号 在所有 C++ 运算符中的优先级最低。 因为它的优先级低于三元条件运算符,所以条件运算符被解析为true? ++x, ++y : --x
true? ++x, ++y : --x
和false? ++x, ++y : --x
false? ++x, ++y : --x
。 在这两种情况下,-- --y
语句都是无条件执行的。
编辑第一个逗号是不同的,因为编译器发现了一个?
,所以现在它需要一个:
来完成条件的“when true”表达式。 这就是++x
和++y
都被采用的原因。
阅读标准
§5.18 逗号运算符 [expr.comma]
¶1 逗号运算符从左到右分组。
expression: assignment-expression expression , assignment-expression
一对用逗号分隔的表达式从左到右求值; 左边的表达式是一个丢弃值表达式(第 5 条)。 83与左表达式相关的每个值计算和副作用在与右表达式相关的每个值计算和副作用之前排序。 结果的类型和值是右操作数的类型和值; 结果与其右操作数属于相同的值类别,并且如果其右操作数是泛左值和位域,则结果是位域。
¶2 在逗号被赋予特殊含义的上下文中,[ 示例:在函数参数列表 (5.2.2) 和初始值设定项列表 (8.5) 中 - 结束示例 ] 第 5 条中描述的逗号运算符只能出现在括号中. [ 例子:
f(a, (t=3, t+2), c);
有三个参数,其中第二个的值为 5。--end example ]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.