-1

我知道 C-Language Lvalue required 错误!当我们收到此错误时,我知道 2 到 3 种情况!Lvalue 表示:需要左侧值!

1)当我们将常量/文字分配给常量而不是变量时,我们得到了!

void main()
{
   int a;

   a = 2;

   8 = 7;//Left side value (variable) required!
}

2) 使用前/后递增递减运算符!

void main()
{
   int a = 2;

   ++a; 
   a++; //variable value is updating!

   ++2;
   2++; //variable value has to be updatable! not a constant/literal value!

   /*
      Both pre & post unary operators workflow is Right --> Left.
      Compiler treats this is also an assignment, So assignment always
      happens to left side only! 
      That's why in these cases also compiler shows: Lvalue required error!
    */  
}

3)棘手的声明!

void main()
{
   int a = 2, b;

   b = ++a++;

   /*
       ++a++ 
       evaluation is...
       1st precedence is pre operator!
       So,

       ++a --> 2 is substituted!

       ++a++; --> 2++ : variable value has to be updatable! not 
                        a constant value! Lvalue required error!
    */           
}

但是在这些情况下我们怎么会得到 Lvalue required 错误呢?求详细评价!

main()
{
  int a=1, b;

  //How come here we get Lvalue required error?
  b = a+++++a;
  b = a-----a;

  //If i give spaces like below, compiler not getting confusion, no error!
  b = a++ + ++a;
  b = a–- – --a;

  //here without spaces also i’m not getting any error!
  b = a–-+–-a;
}

请有人对这些说法给出详细的运营商评价!

//without spaces!
b = a+++++a;
b = a-----a;

b = a--+--a;

//with spaces!
b = a++ + ++a;
b = a-- - --a;
4

1 回答 1

8

因为词法分析器是自动机而不是人。

它只知道那++是一个令牌。当它遇到 a 时+,它会寻找下一个字符——如果它是 a +,那么它将这两个字符视为++标记。

因此,被解析为(如您所料),而是a+++++a被解析为,这当然是一个错误——您不能自增。a++ + ++aa++ ++ + aa++

这同样适用于-。当然,如果你包含空格,那么你基本上告诉词法分析器“这是一个标记边界”,所以它确实会做你期望它做的事情。

至于为什么您在编写时没有收到错误a–-+–-a:再次,您有--令牌,然后是+令牌,然后是另一个--- 这种情况是明确的,因为在遇到 之后+,因为词法分析器知道语言中没有+-令牌,它会处理正确地+作为加号,然后它--再次正确地消耗 。


得到教训:

  1. 经常重复的短语“在 C 中,空格无关紧要”是错误的。

  2. 您确实在令牌之间放置了空格。请漂亮。

  3. 无论如何你都不敢写这样的表达式和语句,因为它们会调用未定义的行为。

于 2013-08-04T07:18:07.843 回答