可能重复:
请帮我理解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)
阅读有关最大蒙克规则的信息.
编译器贪婪所以你的表达
a+++++b
Run Code Online (Sandbox Code Playgroud)
将被理解为
a++ ++ +b
Run Code Online (Sandbox Code Playgroud)
该+运营商级联...用a+++++b,不存在L值(内存寻址值),以增加对加法运算级联后.
换句话说,a+++b是一样的(a++) + b.这是一个有效的操作.同样是真正的与a+++ ++b这相当于(a++) + (++b).但是a+++++b,你没有通过C解析器得到它.它看起来像解析器((a++)++) + b,因为(a ++)返回一个temp,这不是一个可以通过++运算符再次递增的l值.
| 归档时间: |
|
| 查看次数: |
911 次 |
| 最近记录: |