条件运算符中的“错误:左值作为赋值的左操作数”

我是C的新手,今天我学会了“?” 运算符,它是if-else语句的简短类型。 但是,当我执行此代码时:

int b; int x; b=3<2?x=12:x=34; 

我收到错误“错误:左值作为赋值的左操作数需要左值”。 我不明白为什么会这样。 我想到的过程是程序首先将34分配给x,然后将x的值(即34)分配给b。 另一方面,我可以使用该语句作为

 int b; int x; b=3<2?x=12:(x=34); 

没有任何错误。 我查看了我的书,但没有任何帮助。 为什么我不能使用第一个语句? 我的电脑试图做什么? 谢谢…

+1有趣的问题 – 它突出了C ++和C之间的两个区别。

(1)三元表达式的评估规则在C和C ++中是不同的

C ++解析如下

 logical-OR-expression ? expression : assignment-expression 

因此,它通过将assignment-expressionx=34匹配来解析您的语句

 b = 3<2 ? x = 12 : (x = 34); 

但是C这样解析

 logical-OR-expression ? expression : conditional-expression 

x = 34不是conditional-expression因此您的语句将被解析为

 b = (3<2 ? x = 12 : x) = 34; 

(2)C ++中的条件运算符可以返回lvalue ,而C则不能。 因此,以下内容在C ++中是合法的,但在C中则不合法:

 b = (3<2 ? x = 12 : x) = 34; 

在ideone.com上validation了C和C ++编译器。 另请参见这些链接在c中使用三元运算符的错误用于C和C ++三元运算符之间的差异C值和C ++之间的条件运算符差异用于左值规则中的差异