在条件运算符中,需要左值作为赋值的左操作数的错误。

4

我是一名初学者,正在学习C语言。今天我学会了“?”操作符,它是if-else语句的简写形式。然而,当我执行下面的代码时:

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

我遇到了一个错误:“error: lvalue required as left operand of assignment”。我不明白为什么会出现这种情况。在我的理解中,程序首先将34分配给x,然后将x的值(即34)赋值给b。 另一方面,我可以使用以下语句:

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

没有任何错误。我查看了我的书,但没有帮助。为什么我不能使用第一个语句?我的计算机在尝试做什么?


2
运算符优先级可能吗? - Jean-François Fabre
1
"if-else的简短形式" - 它可以被误用,是的。但是甚至不要考虑!并在这些运算符周围使用空格。你的代码应该做什么?看起来你并没有真正理解条件运算符的作用。 - too honest for this site
3
我回答了,但删除了,因为运算符优先级不是原因:“条件运算符中间的表达式(在 ? 和 :之间)被解析时,就像括在括号中一样:它相对于? :的优先级被忽略。” 所以如果它被解析为括号中的表达式,为什么还需要括号呢?(我同意这个结构不是if else,而是三元运算符) - Jean-François Fabre
1
可能更清晰的写法是:b = x = (3 < 2) ? 12 : 34; - Jonathan Leffler
2
编译器是否可能将其评估为 b = (3<2?x=12:x) = 34; 这可以解释“需要左值”的错误。 - John D
显示剩余7条评论
1个回答

3
+1 有趣的问题,它突出了C++和C之间的两个差异。
(1)C和C++中三元表达式的求值规则不同。
(2)C++解析如下:
logical-OR-expression ? expression : assignment-expression

因此,它通过将“赋值表达式”与“x = 34”进行匹配来解析您的语句。
b = 3<2 ? x = 12 : (x = 34);

但是C语言的解析方式如下:
logical-OR-expression ? expression : conditional-expression 

x = 34 不是一个 条件表达式,因此您的语句被解析为

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++(lvalue 规则的区别)。


ideone抑制了很多错误信息,因此它不是一个很好的“验证”工具。建议使用gcc.godbolt.org。 - M.M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接