我查阅过的几乎所有 C/C++ 运算符优先级表都将三元条件运算符列为比赋值运算符具有更高的优先级。但是,有一些表,例如wikipedia上的一个和operator-precedence.com上的一个,将它们置于相同的优先级上。它是哪个,更高还是相同?
3 回答
在 C++ 语法中,
赋值表达式: 条件表达式 逻辑或表达式赋值运算符初始化子句 抛出表达式 条件表达式: 逻辑或表达式 逻辑或表达式?表达式:赋值表达式 初始化子句: 赋值表达式 支撑初始化列表
可以结合到
赋值表达式: 逻辑或表达式 逻辑或表达式?表达式:赋值表达式 逻辑或表达式赋值运算符赋值表达式 逻辑或表达式赋值运算符初始化子句 抛出表达式
如果只看=
and ?:
,而忽略 and 之间的内部表达式?
,:
这显然给出了?:
和=
完全相同的优先级。
这与 C 语法不同,其中?:
' 的左操作数和右操作数都不能将赋值运算符作为其最顶层的运算符。
赋值表达式: 条件表达式 一元表达式赋值运算符赋值表达式 条件表达式: 逻辑或表达式 逻辑或表达式?表达式:条件表达式
所以对于 C 来说,给它们不同的优先级是有意义的。
也就是说,优先级只是标准实际所说的近似值,在某些情况下,您选择的任何优先级都会显示这些级别具有误导性或完全错误。根据你的解释,内心的表达?:
可能是其中之一,它是给我的。
C++ 的答案是这样,?:
并且=
具有相同的优先级。是的,几乎所有的 C++ 运算符优先级表都是错误的。
?:
在 C 中,是否高于无关紧要=
,因为在 C 中,?:
不允许运算符计算左值,如果优先级影响行为,则必须这样做(假设它们是已经 RTL 关联)。例如,请参阅 Luchian Crigore 的回答下的讨论。
也许这个错误是如此普遍,因为早期的 C++ 运算符优先表可能是从 C 表中复制和扩展的。也许错误一直存在,因为唯一的反例 - 形式的表达式a?b:c=d
- 很少使用。也许。
你会发现,在标准中:
5 表达式 [expr]
58) 运算符的优先级不是直接指定的,但可以从语法中推导出来。(笔记)
这意味着优先表是推断的,而不是指定的。只要他们的行为相同,你就可以说两者都是对的。因此,即使优先表将它们设置为具有相同的优先级,或者将三元组放在赋值运算符之上,实际上也会发生同样的事情,因为语法。
请注意,关联性在这里起着更大的作用(这也是从语法派生的)。
即使您假设它们具有相同的优先级:
a = b ? c : d;
将被视为a = (b ? c : d)
因为它们都是right-to-left associative。