C++ 表达式值(运算符优先)

c++ expression value (operator precedence)

提问人:schwillr 提问时间:7/28/2021 更新时间:7/28/2021 访问量:132

问:

以下表达式:-

int main()
{
    int x=2, y=9;
    cout << ( 1 ? ++x, ++y : --x, --y);
}

给出以下输出:-

9

根据我的理解,它应该返回 ++y,应该是 10。哪里出了问题?

C++ 符优先级条件 前缀运 算符

评论

0赞 463035818_is_not_an_ai 7/28/2021
不清楚为什么你期望 ++y 作为输出。我可以理解--y,但是++y是条件的一部分,而不是输出
0赞 Pete Becker 7/28/2021
写成这样:。这应该可以满足您的需求。正如目前的答案所示,这里的分组有点奇怪。(1 ? ++x, ++y : (--x, --y))
0赞 Jarod42 7/28/2021
@463035818_is_not_a_number:OP预计......1 ? (++x, ++y) : (--x, --y)
0赞 463035818_is_not_an_ai 7/28/2021
@Jarod42哦,好吧,我完全误读了条件。这是编写不可读代码的好方法;)

答:

4赞 Jarod42 7/28/2021 #1

根据算子优先级

1 ? ++x, ++y : --x, --y

解析为

(1 ? ++x, ++y : --x), --y

评论

2赞 BoBTFish 7/28/2021
在这里,对运算符优先级的解释会有所帮助。
5赞 Ruks 7/28/2021 #2

与逗号运算符 ( 和 ) 相比,三元运算符 ( 和 ) 的优先级更高。因此,首先计算三元条件中的表达式,然后使用逗号运算符拆分语句。?:,

1 ? ++x, ++y : --x, --y

本质上变成了

   (1 ? (++x, ++y) : (--x)), (--y)
/* ^^^^^^^^^^^^^^^^^^^^^^^^ is evaluated first by the compiler due to higher position in
                            the C++ operator precedence table */

您可以通过简单地将表达式括在括号中来消除该问题:

1 ? (++x, ++y) : (--x, --y)

这迫使编译器首先计算括号内的表达式,而不考虑运算符的优先级。