为什么我会收到lValue错误?

问题描述 投票:2回答:5

我是C语言的新手。我对左值误差有疑问。据我所知,当没有存储Rvalue的permanent-address-bearing-variable时,我们得到一个左值错误。在这里,我可以在左侧看到一个变量。但是,我仍然得到左值误差。有人可以清楚我的左值或使用的运算符的概念。

#include"stdio.h"
void main()
{
int x=10,a;
x<0 ? a = 100 : a = 1000;
printf(" %d",a);
}

谢谢。

c
5个回答
7
投票

这将是

a = x < 0 ? 100 : 1000;

赋值的优先级低于三元运算符,因此它会混乱。

或者这也可行(请记住我之前说的)

x<0 ? (a = 100) : (a = 1000);

编译器如何看待你的?

((x<0) ? a = 100 : a) = 1000;

现在很清楚为什么编译器抱怨lvalue。(三元运算符生成一个rvalue和赋值运算符期望左边的左值)是不是?


0
投票
#include"stdio.h"
void main() {
   int x=10,a;
   a = x<0 ? 100 : 1000;
   printf(" %d",a);
}

三元运算符的使用方式不同。

x =(条件)? val1:va​​l2;

  1. 在这里,条件可以是任何东西。
  2. val1和val2的类型应相同。

0
投票

您可以像这样分配值。

a = x<0 ? 100 : 1000;

0
投票

左值(定位符值)表示占据存储器中某些可识别位置的对象(即具有地址)。

我们举个例子吧

int var;
var = 4;

赋值期望左值作为左操作数,而var是左值,因为它是具有可识别内存位置的对象。另一方面,以下内容无效:

4 = var;       // ERROR!
(var + 1) = 4; // ERROR!

常数4和表达式var + 1都不是左值(这使得它们成为rvalues)。它们不是左值,因为它们都是表达式的临时结果,它们没有可识别的存储位置(即它们可以在计算期间驻留在某个临时寄存器中)。因此,分配它们没有语义意义 - 没有地方可以分配。


0
投票

您没有将操作的结果分配回变量以进行存储。你已经宣布int a但从未使用它。

a = x < 0 ? 100 : 1000;

另外,作为旁注,赋值=的优先级低于三元运算符,因此警告已生成。

© www.soinside.com 2019 - 2024. All rights reserved.