我知道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;
答案 0 :(得分:8)
因为词法分析器是自动机而不是人类。
它只知道++
是一个令牌。当遇到+
时,它会查找下一个字符 - 如果它是+
,则会将这两个字符视为++
令牌。
所以,a+++++a
不解析为a++ + ++a
(正如您所期望的那样),但是a++ ++ + a
,这当然是一个错误 - 你不能自己增加a++
。
同样适用于-
。当然,如果你包含空格,那么你基本上告诉词法分析器"这里是一个标记边界",所以它确实会做你期望它做的。
至于在撰写a–-+–-a
时没有收到错误的原因:再次,您拥有--
令牌,然后是+
令牌,然后是另一个--
- 这case 明确,因为在遇到+
之后,因为词法分析器知道该语言中没有+-
令牌,所以它会处理+
正确地说,它会再次正确地消耗--
。
经验教训:
经常重复的短语"在C中,空格并不重要"是 false。
你要在你的代币之间加上空格。非常好。
并且无论如何都不敢写这样的表达式和语句,因为它们会调用未定义的行为。