为什么在gcc中"a+++++b"无法编译,但"a+++b"、"a++ + ++b"和"a+++ ++b"可以?

5

可能是重复问题:
请帮我理解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;
}

为什么在C语言中a+++++b不起作用? - phuclv
4个回答

13

那是因为 a+++++b 被解析为 a ++ ++ + b而不是a ++ + ++ b [C的tokenizer是贪婪的]. a++ 返回一个 rvalue,你不能在 rvalue 上应用 ++,所以会出现错误。

a+++b; // parsed as a ++ + b
a+++ ++b; // parsed as a ++ + ++ b

了解最大匹配规则。


7
编译器是贪婪的,所以你的表达式
a+++++b

将被理解为
a++ ++ +b

5
+运算符会级联操作...对于a+++++b,在级联加法操作完成后,没有可添加的l-value(可寻址内存值)。
换句话说,a+++b相当于(a++) + b。这是有效的操作。同样适用于a+++ ++b,它等同于(a++) + (++b)。但是,在a+++++b中,你无法通过C解析器获得这个结果。对于解析器来说,它看起来像((a++)++) + b,并且由于(a++)返回一个临时值,这不是一个可以通过++运算符再次增加的l-value。

-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 不行。此外,格式不好。(顺便说一句,我不是那个点踩的人,只是猜测一下他们为什么这样做。) - David X

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接