请问C / C ++三元运营商其实有相同的优先级赋值运算符?(Does the C/C++ tern

2019-07-04 01:49发布

几乎所有的C / C ++运算符优先级表我咨询列表中的三元条件运算符,具有比赋值运算符优先级越高。 有几个表,但是,如一个在维基百科 ,和一个在operator-precedence.com ,那个地方他们在相同的优先级。 这是它,大于或相同?

Answer 1:

在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语法,其中没有不同?: “的左也不是右操作数可以赋值操作符作为其最顶层的运营商。

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

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

因此,对于C,这是有道理的,给他们不同的优先等级。

也就是说,优先次序等级只是什么样的标准实际上是说一个近似值,会有您选择显示的含量会误导或只是简单的错误任何的优先等级的情况。 根据您的解释,内表达?:可能是其中之一,这是对我来说。



Answer 2:

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

在C不要紧是否?:高于=与否,因为在C ?:经营者不得以评估的左值,这是它必须做的,如果优先是影响行为(因为他们已经RTL关联)。 参见下Luchian Crigore的答案例如讨论。

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



Answer 3:

你会发现,在标准:

5个表达式[EXPR]

58)运算符的优先没有直接指定,但它可以从语法中导出。 (注意)

这意味着优先级表是推断,没有规定。 只要他们的行为相同,可以说都是正确的。 所以,即使一个优先顺序表把它们具有相同的优先级,或则以三元赋值运算符以上,在实践中,同样的事情发生,因为语法的。

需要注意的是关联在这里扮演更重要的角色(这也从语法派生)。

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

a = b ? c : d;

将被视为a = (b ? c : d) ,因为两者均是从右到左结合



文章来源: Does the C/C++ ternary operator actually have the same precedence as assignment operators?