#include <stdio.h>
int main()
{
int a = 1, b;
a ? b = 3 : b = 4;
printf("%d, %d", a, b);
return 0;
}
[user@localhost programs]$ gcc -Wall vol.c
vol.c: In function ‘main’:
vol.c:5:16: error: lvalue required as left operand of assignment
a ? b = 3 : b = 4;
^
我已将左值作为b
给出了为什么gcc
显示错误以及如何修复它?
答案 0 :(得分:8)
它与操作员排序有关。编译器认为你正在做的是
(a ? b = 3 : b) = 4
这显然是不正确的。
相反,为什么不将b
放在左侧,只获取要使用条件表达式赋值的值,如
b = a ? 3 : 4;
答案 1 :(得分:1)
条件运算符(?:
)总是在某个条件变为true或false的基础上返回一个值。换句话说,可以说?:
总是返回r值。并且r值永远不会放在赋值表达式的左侧。声明
a ? b = 3 : b = 4;
由编译器解释为
(a ? b = 3 : b) = 4;
类似于等同
3 = 4;
这是错误的。
您声称我已将左值作为b ,这是错误的! b
将绑定到?:
运算符,并通过语句
a ? b = 3 : b;
因此您将r值(3
)分配给r值(4
)!
要使用b
作为l值,您可以通过执行
b = a ? 3 : 4;
这个answer也可以帮助您理解运算符与操作数?:
的绑定。
答案 2 :(得分:-2)
以下编译:
#include <stdio.h>
int main()
{
int a = 1, b;
a ? ( b = 3 ) : ( b = 4 );
printf("%d, %d", a, b);
return 0;
}
我会告诉你一个很长的故事,关于如何不明确地将你的依赖关系括起来会导致代码中的致命问题。但就像在车上系安全带一样 - 很多人只是拒绝相信它是值得的,直到它们处于非常混乱的事故中。