轻松从内存角度深度理解++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当中的运算器进行算术运算和逻辑运算

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

  • 23
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 21
    评论
使用OpenCV进行数字识别的一种常见方法是通过图像处理和机器学算法。下面是基本的步骤1. 准备训练数据集:收集一组包含数字的图像,并每个图像提供正确的标签。使用手写数字数据集(例如MNIST或自己创建一个数据集。 2. 图像预处理:使用OpenCV对图像进行预处理,以提取数字特征并减少噪声。例如,可以使用灰度转换、二值化、滤波等技术。 3. 特征提取从预处理后的图像中提根据你提供的信息,C++中的for循环句的写法是正确的。然而,如果编译器报错说变量未定义,可能是因为你的代码存在其他问题导致编译器无法识别变取数字的关键特征。常见的方法包括轮廓提取、边缘检测、形状分析等量i的定义。 请确保以下几个方面没有问题: 1. 变量i的定义:在for循环之前,你需要先声明并定义变量i。例如,可以在for循环之前语句"int i;"来声明。 4. 训练器:使用机器学习算法训练一个分类器,将提取的特征与正确的标签进行关联。常用的分类器包括支持向量机(SVM)、k最近邻(KNN)等。 5. 数字识别:对于待识别的图像,进行与训练过程相同的预处理步骤,并提取相同的特征。然后使用训练好的分类器对像进行分类,并输出识别结果。 这是一个基本的数字识别流程。体的实现可能会因应用场景和需求的不同而有变化。在实际应用中,还可以使用深度学习技术(如卷积神经网络)来改进识别性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kklovecode

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值