我是 C 新手,今天我学会了“?”运算符,它是 if-else 语句的短类型。但是,当我执行此代码时:
int b;
int x;
b=3<2?x=12:x=34;
我收到一个错误“错误:左值需要作为赋值的左操作数”。我不明白为什么会这样。我脑子里的过程是程序先给x赋值34,然后再给b赋值x的值,也就是34。
另一方面,我可以将语句用作
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-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++ 用于左值规则中的差异
关于c - 条件运算符中的 "error: lvalue required as left operand of assignment",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40388689/