我是C语言的新手。我对左值误差有疑问。据我所知,当没有存储Rvalue的permanent-address-bearing-variable时,我们得到一个左值错误。在这里,我可以在左侧看到一个变量。但是,我仍然得到左值误差。有人可以清楚我的左值或使用的运算符的概念。
#include"stdio.h"
void main()
{
int x=10,a;
x<0 ? a = 100 : a = 1000;
printf(" %d",a);
}
谢谢。
这将是
a = x < 0 ? 100 : 1000;
赋值的优先级低于三元运算符,因此它会混乱。
或者这也可行(请记住我之前说的)
x<0 ? (a = 100) : (a = 1000);
编译器如何看待你的?
((x<0) ? a = 100 : a) = 1000;
现在很清楚为什么编译器抱怨lvalue。(三元运算符生成一个rvalue和赋值运算符期望左边的左值)是不是?
#include"stdio.h"
void main() {
int x=10,a;
a = x<0 ? 100 : 1000;
printf(" %d",a);
}
三元运算符的使用方式不同。
x =(条件)? val1:val2;
您可以像这样分配值。
a = x<0 ? 100 : 1000;
左值(定位符值)表示占据存储器中某些可识别位置的对象(即具有地址)。
我们举个例子吧
int var;
var = 4;
赋值期望左值作为左操作数,而var
是左值,因为它是具有可识别内存位置的对象。另一方面,以下内容无效:
4 = var; // ERROR!
(var + 1) = 4; // ERROR!
常数4
和表达式var + 1
都不是左值(这使得它们成为rvalues)。它们不是左值,因为它们都是表达式的临时结果,它们没有可识别的存储位置(即它们可以在计算期间驻留在某个临时寄存器中)。因此,分配它们没有语义意义 - 没有地方可以分配。
您没有将操作的结果分配回变量以进行存储。你已经宣布int a
但从未使用它。
a = x < 0 ? 100 : 1000;
另外,作为旁注,赋值=
的优先级低于三元运算符,因此警告已生成。