三元运算符和赋值运算符

时间:2013-07-01 14:08:38

标签: c++ c assignment-operator conditional-operator associativity

Does the C/C++ ternary operator actually have the same precedence as assignment operators?

中的

Luchian Grigore的回答说像

这样的案例
a ? b : c = d

将始终推断为

a ? b : ( c = d )

因为=和?:从右到左关联所以

在c ++中

k =  21 > 3 ? j = 12 : j = 10;

k = 1 > 3 ? j = 12 : j = 10;
两个都很好。

在C

k = 21 > 3 ? 12 : j = 10

返回错误

invalid lvalue in assignment.

以上不应推断为(并且不返回任何错误)

k=  21 > 3 ? 12 : ( j = 10 )

我现在假设它被归为

k = ( 21 > 3 ? 12 : j ) = 10

由于在C(不是在C ++中)三元运算符不能返回左值而给出错误。 在这种情况下,任何人都可以告诉我运营商的确切分组。

2 个答案:

答案 0 :(得分:2)

@hvd的链接问题(Does the C/C++ ternary operator actually have the same precedence as assignment operators?)回答显示答案。

?:的C ++和C语法不同。

在C ++中,允许最右边的操作数是赋值表达式(因此编译器[贪婪地]将=视为?:的一部分),而在C中,最右边的操作数是{{ 1}}而不是。因此,只要编译器点击conditional-expression,就会在C中完成=的分析,并将其视为?:

答案 1 :(得分:-1)

k=21>3?12:(j=10)被评估为

if ( 21 > 3 )
    k = 12;
else
    k = ( j = 10 );

由于21>3true,因此不会评估else条件,j具有未定义的值(或此语句之前的任何值)。