10

这里发生了什么事?

#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,但只有左侧操作数递增。

4

3 回答 3

20

第一个相当于:

(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)根本无效。因此,编译器会一直扫描直到找到:,但除此之外,它会在到达较低优先级运算符[(,在此示例中) 或语句结尾] 时停止

于 2012-08-27T04:19:41.423 回答
4

是零,y因为逗号在所有 C++ 运算符中的优先级最低。因为它的优先级低于三元条件运算符,所以条件运算符被解析为true? ++x, ++y : --xand false? ++x, ++y : --x。在这两种情况下,--y语句都是无条件执行的。

编辑第一个逗号是不同的,因为编译器已经找到了 a ?,所以现在它需要 a:来完成条件的“当真”表达式。这就是为什么两者++x++y被纳入。

于 2012-08-27T04:21:55.923 回答
0

阅读标准

§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 ]

于 2012-08-27T04:21:48.967 回答