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

Posted wanmeishenghuo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第17课 ++和--操作符分析相关的知识,希望对你有一定的参考价值。

++和--操作符对应两条汇编指令:

技术分享图片

 

技术分享图片

上图中的表达式,我们的初步分析如下:

技术分享图片

 

完整的示例程序如下:

 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
", i);
11     printf("r = %d
", r);
12 
13     r = (++i) + (++i) + (++i);
14 
15     printf("i = %d
", i);
16     printf("r = %d
", 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课 ++和--操作符分析的主要内容,如果未能解决你的问题,请参考以下文章

数据-第17课-栈课后练习

第55课: 在线广告点击流处理代码的分析和实现

第25课 #和##操作符使用分析

第0-0课 - 引言

[Go] 通过 17 个简短代码片段,切底弄懂 channel 基础

第17课 《编制长文章的大纲》