c++ 表达式值(运算符优先级)
Posted
技术标签:
【中文标题】c++ 表达式值(运算符优先级)【英文标题】:c++ expression value (operator precedence) 【发布时间】: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 哦,好吧,我完全误读了条件。这是编写不可读代码的好方法;)
【参考方案1】:
根据operator precedence,
1 ? ++x, ++y : --x, --y
被解析为
(1 ? ++x, ++y : --x), --y
【讨论】:
这里对operator precedence 的解释会有所帮助。【参考方案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)
这会强制编译器首先计算括号内的表达式,而不考虑运算符的优先级。
【讨论】:
以上是关于c++ 表达式值(运算符优先级)的主要内容,如果未能解决你的问题,请参考以下文章