第十七课 ++和-- 操作符分析
++,- -操作符的本质
++和- -操作符对应两条汇编指令
前置 变量自增(减)1
取变量值
后置 取变量值
变量自增(减)1
++,- -操作符使用分析
int i = 0;
(i++) + (i++) + (i++); 0+1+2=3 i => 3
(++i) + (++i) + (++i); 4+5+6=15 i => 6 gcc编译为5+5+6=16
Windows:vc 10.0 Linux:gcc java
取出三个值,相加,加一 取出i的值,放到寄存器,0+0+0=0
0+0+0=0 1 2 3 再自增1, 1 2 3
i变量自增三次,变成6,再做两个 先自增两次,i=5,相加得10,再对变量自增1,
加法 6+6+6=18 i = 6,再做加法,5 + 5 +6 = 16
操作:VC10.0 打断点,右击,Go To Disassembly,查看汇编语言
gcc 打断点,Debug As,1local C/C++Application
17-1 +±-程序—C语言的灰色地带
C语言中只规定了 ++ 和 - - 对应指令的相对执行次序
++ 和 - - 对应的汇编指令不一定连续运行
在混合运算中,++ 和 - - 的汇编指令可能被打断执行
++ 和 - - 参与运算结果是不确定的。
笔试面试中的“奇葩”题
1.++i+++i+++i
2.a+++b ==> a++ + b
a + ++b
贪心法:++,- -表达式的阅读技巧
编译器处理的每个符号应该尽可能多的包含字符
编译器以从左向右的顺序一个一个尽可能多的读入字符
当读入的字符不可能和已读入的字符组成合法符号为止
17.2 贪心法阅读示例
空格可以作为C语言中一个完整符号的休止符
编译器读入空格后立即对之前读入的符号进行处理
小结:
++ 和 --操作符在混合运算中的行为可能不同
编译器通过贪心法处理表达式中的子表达式
空格可以作为C语言中一个完整符号的休止符
编译器读入空格后立即对之前读入的符号进行处理