为什么"a +++++ b"不能用gcc编译,但"a +++ b","a ++ + ++ b"和"a +++ ++ b"可以?

Eri*_*ang 5 c gcc operators

可能重复:
请帮我理解C中的错误a +++++ b

这是示例代码,为什么"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;
}
Run Code Online (Sandbox Code Playgroud)

Pra*_*rav 13

那是因为a+++++b被解析为a ++ ++ + b而不是a ++ + ++ b[C的标记化器是贪婪的].a++返回一个右值,你不能++在右值上应用,所以你得到了这个错误.

a+++b; // parsed as a ++ + b
a+++ ++b; // parsed as a ++ + ++ b
Run Code Online (Sandbox Code Playgroud)

阅读有关最大蒙克规则的信息.


use*_*419 7

编译器贪婪所以你的表达

a+++++b
Run Code Online (Sandbox Code Playgroud)

将被理解为

a++ ++ +b
Run Code Online (Sandbox Code Playgroud)


Jas*_*son 5

+运营商级联...用a+++++b,不存在L值(内存寻址值),以增加对加法运算级联后.

换句话说,a+++b是一样的(a++) + b.这是一个有效的操作.同样是真正的与a+++ ++b这相当于(a++) + (++b).但是a+++++b,你没有通过C解析器得到它.它看起来像解析器((a++)++) + b,因为(a ++)返回一个temp,这不是一个可以通过++运算符再次递增的l值.