C / C ++三元运算符实际上是否具有与赋值运算符相同的优先级?

我所咨询的几乎所有C / C ++运算符优先级表都列出了三元条件运算符具有比赋值运算符更高的优先级。 但是,有一些表,例如维基百科上的表和operator-precedence.com上的表 ,它们将它们放在相同的优先级上。 它是更高还是更高?

在C ++语法中,

赋值表达式:
    条件表达式
     logical-or-expression assignment-operator initializer-clause
    扔表达

条件表达式:
    逻辑或表达
    逻辑或表达? 表达式:赋值表达式

初始化子句:
    赋值表达式
    支撑-初始化列表

可以结合起来

 assignment-expression:logical-or-expression logical-or-expression?  expression:assignment-expression logical-or-expression assignment-operator assignment-expression logical-or-expression assignment-operator initializer-clause throw-expression 

如果只看=?: ,如果忽略内部表达式? 并且:这显然给出了?:=完全相同的优先级。

这与C语法不同,在C语法中, ?:的左边或右边的操作数都不能将赋值运算符作为其最顶层的运算符。

赋值表达式:
    条件表达式
    一元表达式赋值运算符赋值表达式

条件表达式:
    逻辑或表达
    逻辑OR表达? 表达式:条件表达式

因此对于C来说,赋予它们不同的优先级是有意义的。

也就是说,优先级只是标准实际所说的近似值,您选择的任何优先级都会出现这种情况,表明这些级别具有误导性或者是完全错误的。 根据你的解释, ?:的内在表达可能是其中之一,它适合我。

你会发现,在标准中:

5表达式[expr]

58)运算符的优先级不是直接指定的,但它可以从语法中派生出来。 (注意)

这意味着推断优先级表,而不是指定。 只要它们表现相同,你就可以说两者都是对的。 因此,即使优先级表将它们置于具有相同的优先级,或者将三元组置于赋值运算符之上,实际上由于语法的原因也会发生同样的事情。

请注意, 关联性在这里起着更大的作用(这也是从语法中派生出来的)。

即使您认为它们具有相同的优先级:

 a = b ? c : d; 

将被视为a = (b ? c : d)因为它们都是从右到左的关联

C ++的答案是?:=具有相同的优先级。 是的,几乎每个C ++运算符优先级表都有错误。

在C中, ?:是否高于=并不重要,因为在C中,不允许将?:运算符计算为l值,如果优先级影响行为,则必须执行此操作(鉴于它们已经是RTL关联的)。 例如,参见Luchian Crigore的答案下的讨论。

也许这个错误是如此普遍,因为早期的C ++运算符优先级表可能已经从C表中复制和扩展。 也许错误一直存在,因为唯一的反例 – forms为a?b:c=d表达式很少使用。 也许。