为啥“a+++++b”不能在gcc中编译,而“a+++b”、“a++ + ++b”、“a+++ ++b”可以? [复制]
Posted
技术标签:
【中文标题】为啥“a+++++b”不能在gcc中编译,而“a+++b”、“a++ + ++b”、“a+++ ++b”可以? [复制]【英文标题】:Why "a+++++b" can not be compiled in gcc, but "a+++b", "a++ + ++b", and "a+++ ++b" can be? [duplicate]为什么“a+++++b”不能在gcc中编译,而“a+++b”、“a++ + ++b”、“a+++ ++b”可以? [复制] 【发布时间】:2011-08-10 19:24:09 【问题描述】:可能重复:Please help me understanding the error a+++++b in 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;
【问题讨论】:
Why doesn't a+++++b work in C? 【参考方案1】:+
运算符级联 ... 与 a+++++b
,在加法运算级联后没有要添加的左值(内存可寻址值)。
换句话说,a+++b
与 (a++) + b
相同。这是一个有效的操作。 a+++ ++b
也是如此,它等同于 (a++) + (++b)
。但是使用a+++++b
,您无法通过C 解析器获得它。对于解析器,它看起来像 ((a++)++) + b
,并且由于 (a++) 返回一个临时值,因此它不是一个可以通过 ++
运算符再次递增的左值。
【讨论】:
【参考方案2】:# 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);
printf("a+++++b is: %d\n", c);
return 0;
【讨论】:
OP(大概)已经知道这会起作用;他们想知道 为什么a+++++b
不知道。另外,格式不好。 (不是那个投反对票的人,只是对他们这样做的原因做出有根据的猜测。)【参考方案3】:
编译器很贪心所以你的表达方式
a+++++b
会被理解为
a++ ++ +b
【讨论】:
【参考方案4】:这是因为a+++++b
被解析为a ++ ++ + b
而不是a ++ + ++ b
[C 的标记器是贪婪的]。 a++
返回一个右值,你不能在一个右值上应用++
,所以你会得到那个错误。
a+++b; // parsed as a ++ + b
a+++ ++b; // parsed as a ++ + ++ b
阅读最大咀嚼规则。
【讨论】:
以上是关于为啥“a+++++b”不能在gcc中编译,而“a+++b”、“a++ + ++b”、“a+++ ++b”可以? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 gcc 编译器不能识别 bzip2 函数,但允许我包含它们所属的库?
为啥使用 Visual Studio 而不是 GCC 编译时没有错误?