为什么我会收到lValue错误?

时间:2018-03-04 07:30:15

标签: c

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

[
  {
    "key": 1,
    "name": "test",
    "value": "NY"
  },
  {
    "key": 3,
    "name": "test",
    "value": "MA"
  },
  {
    "key": 1,
    "name": "test",
    "value": "NJ"
  },
  {
    "key": 2,
    "name": "test",
    "value": "CA"
  },
  {
    "key": 1,
    "name": "test",
    "value": "TX"
  }
]

谢谢。

5 个答案:

答案 0 :(得分:7)

这将是

a = x < 0 ? 100 : 1000;

分配比三元运算符具有更低的优先级,因此它变得混乱。

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

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

编译器如何看待你的?

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

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

答案 1 :(得分: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的类型应相同。

答案 2 :(得分:0)

  

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

我们举个例子

int var;
var = 4;

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

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

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

答案 3 :(得分:0)

您可以像这样分配值。

a = x<0 ? 100 : 1000;

答案 4 :(得分:0)

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

a = x < 0 ? 100 : 1000;

另外,作为附注,作业=的优先级低于三元运算符,因此产生了警告。