为什么“a+++++b”是gcc 中无法编译,但 "a"++b"、"a"+ + “a”和“a” ++b"可以吗?
可能的重复:
请帮助我理解错误 a+++++b C
这是示例代码,为什么“a++++++b”不能编译,而其他的可以?
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
int a = 0;
int b = 0;
int c = 0;
c = a+++b;
printf("a+++b is: %d\n", c);
c = a = b = 0;
c = a++ + ++b;
printf("a++ + ++b is: %d\n", c);
c = b = a = 0;
c = a+++ ++b;
printf("a+++ ++b is: %d\n", c);
c = b = a = 0;
c = a+++++b; // NOTE: Can not be compiled here.
printf("a+++++b is: %d\n", c);
return 0;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
这是因为
a+++++b
被解析为a ++ ++ + b
而不是a ++ + ++ b
[C 的分词器是贪婪的]。a++
返回一个右值,并且您不能将++
应用于右值,因此您会收到该错误。了解最大蒙克规则。
That's because
a+++++b
is parsed asa ++ ++ + b
and not asa ++ + ++ b
[C's tokenizer is greedy].a++
returns an rvalue and you cannot apply++
on an rvalue so you get that error.Read about Maximal Munch Rule.
编译器是贪婪的,所以你的表达式
将被理解为
The compiler is greedy so your expression
will be understood as
+
运算符级联 ... 与a+++++b
,在级联加法运算后没有左值(内存可寻址值)可相加。换句话说,
a+++b
与(a++) + b
相同。这是一个有效的操作。a+++ ++b
也是如此,它相当于(a++) + (++b)
。但是对于a+++++b
,您无法通过 C 解析器获得它。对于解析器来说,它看起来像((a++)++) + b
,并且由于 (a++) 返回一个临时值,因此它不是可以通过++ 再次递增的左值
运算符。The
+
operators cascade ... witha+++++b
, there is no l-value (memory addressable value) to add against after the addition operations are cascaded.Put another way,
a+++b
is the same as(a++) + b
. That's a valid operation. The same is true witha+++ ++b
which equates to(a++) + (++b)
. But witha+++++b
, you don't get that via the C-parser. To the parser it looks like((a++)++) + b
, and since (a++) returns a temp, that's not an l-value that can be incremented again via the++
operator.