(++i)+(++i)+(++i)
错误结果:15
正确的结果:
编译器处理方式1:++i=4 ++i=5 ++i=6
6+6+6 = 18
处理方式2:
++i=4 ++i=5
5+5+(++i)=5+5+6 = 16 (gcc、g++编译器的结果)
并没有标准结果,具体情况由编译器决定,这是C的灰色地带。
int x;
int i=3;
x=(++i,i++,i+10);
逗号表达式规则:从左到右顺序求值,最后一个表达式的值就是所需的值!
执行:
++i = 4 i++ =5 5+10 =15
15为所求!
++i+++i+++i
贪心法制:
编译器处理的每个符号应该尽可能多的包含字符
编译器以从左向右的顺序一个一个尽可能多的读入字符
当即将读入的字符不可能和已读入的字符组成合法符号为止
a+++b --》 a++ + b
#include <stdio.h>
int main()
{
int i = 0;
int j = ++i+++i+++i; //错误1
int a = 1;
int b = 2;
int c = a+++b;
int* p = &a;
b = b/*p; //错误2
return 0;
}
编译器读取
++i+++i+++i
++i++ 2++ 常量无法自增!
c = a+++b; 编译器解释为c=a++ + b
b = b/*p; 编译器将/*解释为注释