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来说,赋予它们不同的优先级是有意义的.
也就是说,优先级只是标准实际所说的近似值,您选择的任何优先级都会出现这种情况,表明这些级别具有误导性或者只是错误的.根据你的解释,内在表达?:可能是其中之一,它适合我.
你会发现,在标准中:
58)运算符的优先级不是直接指定的,但它可以从语法中派生.(注意)
这意味着推断优先级表,而不是指定.只要它们表现相同,你就可以说两者都是对的.因此,即使优先级表将它们置于具有相同的优先级,或者将三元组置于赋值运算符之上,实际上也会因语法而发生相同的事情.
请注意,关联性在这里起着更大的作用(这也来自语法).
即使您认为它们具有相同的优先级:
a = b ? c : d;
Run Code Online (Sandbox Code Playgroud)
将被视为a = (b ? c : d)因为它们都是从右到左的关联.
C++的答案是?:并且=具有相同的优先级.是的,几乎每个C++运算符优先级表都有错误.
在C中,是否?:高于=或者无关紧要,因为在C中,?:不允许运算符求值为l值,如果优先级影响行为,则必须执行此操作(假设它们是已经RTL关联).例如,参见Luchian Crigore的答案下的讨论.
也许这个错误是如此普遍,因为早期的C++运算符优先级表可能已经从C表中复制和扩展.也许错误一直存在,因为唯一的反例 - 表单的表达式a?b:c=d- 很少使用.也许.