轻松从内存角度深度理解++i与i++的本质区别(一看就懂)

轻松从内存角度深度理解++i与i++的本质区别(一看就懂)

这篇文章我将主要介绍++i和i++不同的一些底层逻辑不同,相信大家在网上也看到了不少资料都说明:++i是先自增+1,再使用(即再进行表达式运算);而i++是先使用,再进行自增+1。

接下里我们通过以下代码和代码的汇编从内存角度看待此过程
这里无需懂多少汇编代码就能理解``

int main()
{
    
    
    int b = 0;
    int a = 0;
    b = a++ //此时为后置++,即先使用,之后再进行++
   	return 0;
}

下面是此段代码在VS2019中通过反汇编得到的汇编代码
在这里插入图片描述
关键从b =a++;开始分析
第一个mov指令:代表了变量a首先赋值给了eax寄存器(寄存器的意义在此可以看作一个临时存储的作用);
第二个mov指令:之后这个eax寄存器的值赋给了变量b,于是b便得到这个值.
第三个mov指令:此时变量a的值赋值给了ecx寄存器(注意与上面eax不同了)
第四步add指令:意思是将ecx的值进行+1
最后一步:move指令便是将+1后的值返回给变量a,所以此时a的值才多了1

此时我们将a++变成++a,再来看过程

int main()
{
    
    
	int b = 0;
	int a = 0;
	b = ++a;//前置++,先+1,再使用
	return 0;
}

在这里插入图片描述
还是从b= ++a;开始看
第一步mov指令:将变量a的值赋值给eax寄存器
第二步:add指令:给eax的值+1(这一步也是与上面区分的关键)
第三步mov指令:eax寄存器的值返回给a,此时已经是+1之后的值了
之后两步便是跟上面差不多,a的值交给ecx后,由ecx赋值给变量b

由上述分析,我们就能很快的理解到为什么++i和i++会有+1的时间上的区别了

这还没完,有时候我们会对与一些单独出现的++i或者i++有些顾虑,这里我们也来进行一波分析

int i = 0;
while (i < 32)
{
    
    
	printf("%d", i);
	i++; //此处也可以改成i++
}

像这种单独出现++或者–,其实本质都是一样的
老规矩,看汇编代码!
在这里插入图片描述
这里我们只关注i++这一步
首先第一步:mov是把i的值先给寄存器
第二步:就直接+1(而我们上述代码中,前面有使用,所以会将值返回给使用者之后再进行++操作,但这里并没有)
第三步就是将加1后值返回给变量i

接下来我们改成++i;

在这里插入图片描述
首先第一步还是将i交给eax,第二步直接+1.第三步将值返回给i。

总结:所以当++i或者i++是单独出现的时候(没有使用者)时,其实两者是一个意思

PS:最后想跟大家说的是,看到这些汇编代码,或许心中会与这样的疑问,为什么每次都要借助类似eax寄存器?
其实道理很简单,变量的值本质是在 内存当中,但是一旦这些值进行运算时,一定会加载进cpu当中的,只有在cpu当中才会进行运算,先存给cpu中寄存器,再由cpu当中的运算器进行算术运算和逻辑运算

创作不易,喜欢的话大家给个三连哇!!!有问题可以沟通交流哦,评论区见咯!

猜你喜欢

转载自blog.csdn.net/kklovecode/article/details/131545282