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 ++中)三元运算符不能返回左值而给出错误。 在这种情况下,任何人都可以告诉我运营商的确切分组。
答案 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>3
为true
,因此不会评估else条件,j
具有未定义的值(或此语句之前的任何值)。