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

时间:2011-04-22 06:36:40

标签: c gcc operators

  

可能重复:
  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;
}

4 个答案:

答案 0 :(得分:13)

那是因为a+++++b被解析为a ++ ++ + b而不是a ++ + ++ b [C的令牌化器是贪婪的]。 a++会返回一个右值,您无法在右值上应用++,因此您会收到该错误。

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

了解最大蒙克规则。

答案 1 :(得分:7)

编译器贪婪所以你的表达式

a+++++b

将被理解为

a++ ++ +b

答案 2 :(得分:5)

+运算符级联...与a+++++b,在添加操作级联后没有要添加的l值(内存可寻址值)。

换句话说,a+++b(a++) + b相同。这是一个有效的操作。 a+++ ++b等同于(a++) + (++b)也是如此。但是对于a+++++b,你不能通过C语言分析器得到它。对于解析器,它看起来像((a++)++) + b,并且因为(a ++)返回一个temp,这不是一个可以通过++运算符再次递增的l值。

答案 3 :(得分:-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;
}
相关问题