关于一下这点我们先看一段代码
#include<stdio.h>
int main()
{
int i = 0;
printf("%d %d %d\n",i++,++i,i--);
return 0;
}
我相信有很多人认为结果应该是0 0 0。可是我们在vs2019里面运行一下看看发现
结果是0 1 0。这里就有小伙伴好奇了,心里一百个????这么可能是这样!!!
讲之前我们要清楚printf()这个函数是从右向左依次计算的。而且是把表达式历经一遍,再全部入栈!!
i++(--)的操作顺序如下:
1.先把i的值存储在[EBP-&]的一个缓存单元中
2.把i的值自增加1
3.将[EBP-&]作为i++返回值
(--)++i的操作顺序如下:
1.先把i的值加自增加1
2.将i作为++i返回值
这样我们就清楚了,原来我们段代码首先注意到i--,先将i的值放入缓存单元,此时缓存单元里的值是0,而i的值自减1变成了-1。接着注意到++i将i的值自增1,此时i的值是0。紧接着注意到i++,此时缓存单元里面的值是0,i的值变成了1。然后我们打印此时i++的返回值来自缓存单元里面,就是0,然后++1打印它的返回值是i,即是1。最后打印i--,它的返回值也是来自缓存单元,而缓存单元里面的值是0,即打印0。所以我们的结果是0 1 0
这里我们不难发现当我们使用后置++(--)的时候要先创建一个缓存空间,而我们使用前置++
(--)的时候则不用,所以在计算时往往前置++(--)的效率更高!!!