Lvalue需要错误混淆?

时间:2013-08-04 07:13:41

标签: c lvalue

我知道C语言Lvalue所需的错误! 当我们收到此错误时,我知道2到3个案例! 左值意味着:需要左侧值!

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所需的错误? 求详细评估!

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;

1 个答案:

答案 0 :(得分:8)

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

它只知道++是一个令牌。当遇到+时,它会查找下一个字符 - 如果它是+,则会将这两个字符视为++令牌。

所以,a+++++a 解析为a++ + ++a(正如您所期望的那样),但是a++ ++ + a,这当然是一个错误 - 你不能自己增加a++

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

至于在撰写a–-+–-a时没有收到错误的原因:再次,您拥有--令牌,然后是+令牌,然后是另一个-- - 这case 明确,因为在遇到+之后,因为词法分析器知道该语言中没有+-令牌,所以它会处理+正确地说,它会再次正确地消耗--


经验教训:

  1. 经常重复的短语"在C中,空格并不重要"是 false。

  2. 你要在你的代币之间加上空格。非常好。

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