为啥“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 编译时没有错误?

为啥这段代码不能用 VS2010 和 gcc 4.8.1 编译

为啥使用gcc编译时总显示找不到文件

为啥以下代码使用clang而不是gcc编译

为啥在Linux中strlwr()不能编译通过,已经查看过<string.h>,的确在头文件中没有