三元运算符和赋值运算符

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>3true ,否则不会评估else条件,并且j具有未定义的值(或者在此语句之前具有的任何值)。