标签:运行 不同 color 操作符 width i++ 汇编 span clu
++和--操作符对应两条汇编指令:
上图中的表达式,我们的初步分析如下:
完整的示例程序如下:
1 #include <stdio.h> 2 3 int main() 4 { 5 int i = 0; 6 int r = 0; 7 8 r = (i++) + (i++) + (i++); 9 10 printf("i = %d\n", i); 11 printf("r = %d\n", r); 12 13 r = (++i) + (++i) + (++i); 14 15 printf("i = %d\n", i); 16 printf("r = %d\n", r); 17 18 return 0; 19 }
vc编译器的额结果如下:
i自增了6次,最终为6。但是两个r的值和我们的分析不一样,这是不是错了呢?
gcc下的运行结果如下:
两种编译器得到了两种不同的结果,这就是C语言里面的灰色地带。
vc中第8行的反汇编结果如下:
首先取出i的值,然后连续累加了两次(相当于i+i+i),将得到的最终的结果存入r。接下来将i变量自增1,连续做了3次。
第13行的程序在vc中的反汇编如下:
vc编译器将i先自增3次,这时i为6,然后做加法,相当于i+i+i。r最终为18。
gcc中第8行的反汇编如下:
先将变量i的值取出来,然后执行了2次加法(相当于i+i+i),然后将结果放到r中。最后将i自增3次。这种处理和vc是一样的。
第13行在gcc中的反汇编如下:
先对i自增了两次,这时i为5,然后执行一次加法(相当于i+i),然后再对i自增1,这时i变成了6,这时再做加法,得到最终结果16。
为什么两个编译器会有不同的结果呢?
++和--分别对应两条汇编指令,这两条指令相对执行次序是一定的,但是它们不一定是相邻的。例如,对于前置++来说,先自增1,在将值取出来使用,在这两条行为之间可能夹杂着其它行为。
标签:运行 不同 color 操作符 width i++ 汇编 span clu
原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9535846.html