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

时间:2012-11-22 15:04:13

标签: c++ c ternary-operator operator-precedence

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

3 个答案:

答案 0 :(得分:12)

在C ++语法中,

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

conditional-expression:
    logical-or-expression
    logical-or-expression ? expression : assignment-expression

initializer-clause:
    assignment-expression
    braced-init-list

可以合并到

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

如果仅查看=?:,如果忽略?:之间的内部表达,则明确给出?:和{{1完全相同的优先级。

这与C语法不同,C语法中=左侧和右侧操作数都不能将赋值运算符作为其最顶层运算符。

assignment-expression:
    conditional-expression
    unary-expression assignment-operator assignment-expression

conditional-expression:
    logical-OR-expression
    logical-OR-expression ? expression : conditional-expression

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

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

答案 1 :(得分:7)

你会发现,在标准中:

5表达式[expr]

  

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

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

请注意,关联性在此处扮演更重要的角色(这也来自语法)。

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

a = b ? c : d;

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

答案 2 :(得分:7)

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

在C中,?:是否高于=并不重要,因为在C中?:运算符不允许计算为l值,这是如果优先级会影响行为,那么它必须做什么(假设它们已经是RTL关联的)。例如,参见Luchian Crigore的答案下的讨论。

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