【问题标题】:c++ expression value (operator precedence)c++ 表达式值(运算符优先级)
【发布时间】:2021-10-04 05:52:53
【问题描述】:

下面的表达式:-

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

给出以下输出:-

9

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

【问题讨论】:

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

标签: c++ operator-precedence conditional-operator prefix-operator


【解决方案1】:

根据operator precedence

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

被解析为

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

【讨论】:

【解决方案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)

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

【讨论】:

    猜你喜欢
    • 2011-07-24
    • 1970-01-01
    • 2020-06-23
    • 2017-10-25
    • 2013-12-28
    • 2016-08-20
    • 2013-08-04
    • 2013-02-24
    • 2017-06-02
    相关资源
    最近更新 更多