c - 条件运算符中的 "error: lvalue required as left operand of assignment"

标签 c assignment-operator conditional-operator lvalue

我是 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 上针对 C 和 C++ 编译器进行了验证。 另请参阅这些链接 Errors using ternary operator in c用于 C 和 C++ 三元运算符之间的差异 Conditional operator differences between C and C++对于左值规则的差异

关于c - 条件运算符中的 "error: lvalue required as left operand of assignment",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40388689/

相关文章:

c++使用指向其他类的指针重载类的赋值运算符

c++ - 条件运算符不允许程序终止

c# - 条件运算符表达式(连续几个)

c++ - 我可以像 Julia 中的 Rcpp 的 stop() 一样在 c 代码中抛出错误吗

c - C 中的变量替换

c++ - 我们什么时候应该将赋值运算符设为私有(private)而不是实现

r - 使用样式器设置 R 代码样式时,使用 = 而不是 <- 进行赋值

c - block 作用域缓冲区在 c 中的 block 之外是否有效

C - for 循环初始值设定项中的 while 运算符

c - 三元运算符中的赋值