三元运算符和赋值运算符
in C / C ++三元运算符实际上是否具有与赋值运算符相同的优先级?
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 ++中)三元运算符不能返回左值,因此给出错误。 任何人都可以告诉我在这种情况下运算符的确切分组。
您的链接问题( C / C ++三元运算符实际上是否具有与赋值运算符相同的优先级? )@hvd的答案显示了答案。
?:
的C ++和C语法是不同的。
在C ++中,允许最右边的操作数是赋值表达式(因此编译器[贪婪]将=
视为?:
一部分)而在C中,最右边的操作数是conditional-expression
。 因此,在编译器命中时,在C中, ?:
的分析完成,并将其视为k = ( 21 > 3 ? 12 : j ) = 10
。
k=21>3?12:(j=10)
被评估为
if ( 21 > 3 ) k = 12; else k = ( j = 10 );
由于21>3
为true
,否则不会评估else条件,并且j
具有未定义的值(或者在此语句之前具有的任何值)。