这里发生了什么事?
#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
的预期。
作为一个注释(以另一种答案)指出Barmar :
而如果你想知道为什么之间的逗号++x
和++y
不具有同样的效果,这是因为(true? ++x)
将是无效的。 因此,编译器保持扫描直到它找到:
,但除此之外,当它到达一个较低优先级操作符[(停止,
在这个例子中)或语句的末尾。
该y
为零,因为逗号有所有的C ++运营商中最低的优先级 。 因为它的优先级比三元条件运算符更低,条件运算符解析为true? ++x, ++y : --x
true? ++x, ++y : --x
和false? ++x, ++y : --x
false? ++x, ++y : --x
。 在这两种情况下, --y
语句无条件地执行。
EDIT因为编译器已经发现了第一个逗号是不同的?
,所以现在它需要:
完成条件的“真时”表达。 这就是为什么这两个++x
和++y
被欺骗。
阅读标准
§5.18逗号运算符[expr.comma]
¶1左到右的逗号操作员组。
expression: assignment-expression expression , assignment-expression
一对由逗号分隔的表达式求值左到右; 左表达式是discardedvalue表达式(第5章)。 83与左表达相关的每个值的计算和副作用与右表达相关的每一个值的计算和副作用之前测序。 结果的类型和值是类型和右操作数的值; 结果是相同的值类别作为其右操作数的,并且是位字段,如果它的右操作数是一个glvalue和位字段。
¶2在逗号被赋予特殊的含义的上下文,[实施例:在以函数(5.2.2)和初始化的列表(8.5)-end例的参数列表]逗号运算符在第5所描述的,只能在括号出现。 [实施例:
f(a, (t=3, t+2), c);
有三个参数,其中第二个具有值5末端示例]
文章来源: What's the precedence of comma operator inside conditional operator in C++?