【问题标题】:Why am I getting an lValue Error?为什么我会收到 lValue 错误?
【发布时间】:2018-03-04 07:30:14
【问题描述】:

我是 C 语言的新手。 我对左值错误有疑问。 据我所知,当没有永久地址承载变量来存储右值时,我们会得到一个左值错误。在这里,我可以在左侧看到一个变量。但是,我仍然得到左值错误。 有人可以清除我对左值或使用的运算符的概念。

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

谢谢。

【问题讨论】:

    标签: c


    【解决方案1】:

    应该是

    a = x < 0 ? 100 : 1000;
    

    赋值的优先级低于三元运算符,所以它搞砸了。

    或者这也可以(记住我之前所说的)

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

    编译器如何看待你的?

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

    现在很清楚为什么编译器会抱怨左值。(三元运算符生成一个右值,而赋值运算符希望它的左边有一个左值)不是吗?

    【讨论】:

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

      三元运算符的用法不同。

      x = (条件)? val1 : val2;

      1. 在这里,条件可以是任何东西。

      2. val1 和 val2 的类型应该相同。

      【讨论】:

        【解决方案3】:

        你可以这样赋值。

        a = x<0 ? 100 : 1000;
        

        【讨论】:

          【解决方案4】:

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

          举个例子

          int var;
          var = 4;
          

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

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

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

          【讨论】:

            【解决方案5】:

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

            a = x < 0 ? 100 : 1000;
            

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

            【讨论】: