前置++ --
先变量自增(减)1,取变量值;
后置++ --
取变量值,再变量自增(减)1;
问题
int i = 0;
(i++) + (i++) + (i++)
//猜测结果0+1+2 = 3
(++i) + (++i) + (++i)
//猜测结果4+5+6=15
这两个表达式值是多少?
int i = 0;
int r = 0;
r = (i++) + (i++) + (i++);
printf("i=%d\n", i);
printf("r=%d\n", r);
printf("\n");
r = (++i) + (++i) + (++i);
printf("i=%d\n", i);
printf("r=%d\n", r);
vs2017结果为
和我们猜测的答案完全不一样。在gcc编译器的结果也是不一样的。
这其实是c语言的灰色地带。在不同的编译器里有不同的结果,因为不同编译器的汇编实现不一样,所以结果也不一样。因为在C语言中只规定了++ -- 的相对执行顺序,但汇编指令却不一定会连续执行,所以在混合运算中,++--的汇编指令会被打断。所以++--的混合运算结果是不确定的。所以所以不要写这样类似的代码。
贪心算法
编译器处理的每个符号应该尽可能多的包含字符
编译器以从左向右的顺序一个一个尽可能的读取字符
当读入的字符不可能和以读入的字符组合成的合法字符为止。
实例说明
int main()
{
int i = 0;
int j = ++i+++i+++i;//++i++ ==>1++ 错误 加入空格就解决了
int a = 1;
int b = 4;
int c = a+++b;//a++ +b ==>a=2
int* p = &a;
b = b/*p;//这里会成为注释。
printf("i = %d\n", i);
printf("j = %d\n", j);
printf("a = %d\n", a);
printf("b = %d\n", b);
printf("c = %d\n", c);
return 0;
}
空格是C语言完整字符的休止符。读入空格后会立即对前面的字符进行处理。
所以要尽量使用空格。
学习交流群199546072