以下是示例代码,为什么“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;
}
答案 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;
}