码迷,mamicode.com
首页 > 其他好文 > 详细

第17课 ++和--操作符分析

时间:2018-08-26 00:05:12      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:运行   不同   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,在将值取出来使用,在这两条行为之间可能夹杂着其它行为。

 

第17课 ++和--操作符分析

标签:运行   不同   color   操作符   width   i++   汇编   span   clu   

原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9535846.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!