我是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);
没有任何错误。我查看了我的书,但没有任何帮助。为什么我不能使用第一个语句?我的电脑试图做什么? 感谢...
答案 0 :(得分:2)
+1有趣的问题 - 它突出了C ++和C之间的两个区别。
(1)三元表达式的评估规则在C和C ++中是不同的
C ++解析如下
logical-OR-expression ? expression : assignment-expression
因此,通过将assignment-expression
与x=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上验证了C和C ++编译器。 另见这些链接 Errors using ternary operator in c用于C和C ++三元运算符之间的差异 Conditional operator differences between C and C++用于左值规则中的差异