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

Posted

技术标签:

【中文标题】条件运算符中的“错误:需要左值作为赋值的左操作数”【英文标题】:"error: lvalue required as left operand of assignment" in conditional operator 【发布时间】:2017-03-16 06:45:22 【问题描述】:

我是 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);

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

【问题讨论】:

可能是运算符优先级? 如果您想在x 中产生副作用,并将该值分配给b,您需要在both 备用表达式周围加上括号。 b = 3 &lt; 2 ? (x=12) : (x=34); 尝试在该三元运算符后添加 printf("%d %d\n", b, x); "if-else 的短类型" - 可以miss这样使用,是的。但是别想了!并在这些运算符周围使用空格。你的代码应该做什么?看起来你还没有真正理解条件运算符的作用。 仍然,我回答但删除了,因为运算符优先级不是这里的原因:“条件运算符中间的表达式(在?和:之间)被解析为括号:它的优先级相对于? : 被忽略”。所以如果它被解析为好像带括号为什么它需要括号(我同意构造不是很好,这不是 if else 而是三元运算符) 编译器能否评估为b = (3&lt;2?x=12:x) = 34; 这可以解释“需要左值”错误。 【参考方案1】:

+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++ 用于左值规则中的差异

【讨论】:

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

以上是关于条件运算符中的“错误:需要左值作为赋值的左操作数”的主要内容,如果未能解决你的问题,请参考以下文章

左值需要作为赋值的左操作数(递增引用的变量)C++

尝试对链表进行排序时出现左值错误

三元条件运算符中的多个条件?

java中的条件运算符是啥?

C中的三元(条件)运算符

猫鼬中的条件运算符