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

Mus*_*ful 7 c c++ ternary-operator operator-precedence

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

小智 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

如果只盯着=?:,如果忽视的内在表达?:,这显然给了?:=精确的相同的优先级.

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

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

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

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

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

  • 在您的示例中,赋值是包含三元运算符表达式的子表达式.因此,优先权并不完全适用. (3认同)
  • @hvd你的答案如何证明什么?只有一种方法可以在括号中加上括号`a?b = c:d`,所以第二个例子没用.第一个例子表明`?`的优先级高于(或相同)优于`=`. (2认同)

Luc*_*ore 8

你会发现,在标准中:

5表达式[expr]

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

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

请注意,关联性在这里起着更大的作用(这也来自语法).

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

a = b ? c : d;
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,但优先级仍然会影响 `a?b:c=d` 的解释。是`(a?b:c)=d` 还是`a?b:(c=d)`? (2认同)

Mus*_*ful 7

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

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

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