重点讲解 i++ 和 ++i

重点讲解 i++ 和 ++i,第1张

重点讲解 i++ 和 ++i

文章目录
    • 序言
    • 为什么会有自增运算符
    • ++等于+1吗?
      • 后置++
        • 样例一
        • 样例二
        • 汇编代码
        • 结论
      • 前置++
        • 样例一
        • 样例二
        • 汇编代码
        • 结论
    • 题外话

序言

在语言学习中,我们都会遇到很多将变量加一的情况,我们为了简便创造出了自增(+1)和 自减(-1)运算符,也就是++ 和 --,今天我们就以 ++ 为例,来详细的说一下。

为什么会有自增运算符

++运算符在B语言中就被创立的,C语言继承了他,我们大量使用的原因是他们简洁和便利,他们现在并不会使得程序变得更短或更快。

++等于+1吗?

首先,我们先肯定一件事 ++可以得到 *** 作数+1的效果

#include

int main()
{
	int i = 0;
	i++;
	printf("%dn", i);
	return 0;
}

这里你会发现i++ 和 i = i+1的结果是一样的,事实上他们是有些区别的,我们继续验证

后置++ 样例一
#include

int main()
{
	int i = 0;
	
	printf("%dn", i++);
	return 0;
}

样例二
#include

int main()
{
	int i = 0;
	int j = i++;
	printf("%dn", j);
	printf("%dn", i);
	return 0;
}

这就出现问题了,我们要好好的考虑一下了

i++的意思是 现在先使用i的值,稍后再在自增i,这就有有意思了,稍后是多久?很抱歉C语言标准中没有给出精确的时间,但是我们可以放心的认为再下一条语句前就完成了自增。

汇编代码
#include

int main()
{
	int i = 0;
	int j = 0;
	j = i++;
	return 0;
}

对应的汇编语言

	int i = 0;
007B1775  mov         dword ptr [i],0     
	int j = 0;
007B177C  mov         dword ptr [j],0  
	j = i++;
007B1783  mov         eax,dword ptr [i]  
007B1786  mov         dword ptr [j],eax  
007B1789  mov         ecx,dword ptr [i]  
007B178C  add         ecx,1  
007B178F  mov         dword ptr [i],ecx  
	return 0;

我们只解释最重要的一部分

	j = i++;
007B1783  mov         eax,dword ptr [i]   //把i的值放到eax寄存器里面
007B1786  mov         dword ptr [j],eax   //把eax的值给y
007B1789  mov         ecx,dword ptr [i]   //把i的值给ecx寄存器
007B178C  add         ecx,1               //ecx的值 +1 结果放到ecx中
007B178F  mov         dword ptr [i],ecx   //ecx的值给i
结论
  • 后置++先使用,后++
前置++ 样例一

和上面的一样,我们先给出现象

#include

int main()
{
	int i = 0;
	printf("%dn", ++i);
	return 0;
}

样例二
#include

int main()
{
	int i = 0;
	int j = 0;
	j = ++i;
	printf("%dn", j);
	printf("%dn", i);
	return 0;
}

这里我们会看到和之前的不一样,好像是先自增了,究竟是不是,我们验证一下

汇编代码
	int i = 0;
005A1DF5  mov         dword ptr [i],0  
	int j = 0;
005A1DFC  mov         dword ptr [j],0  
	j = ++i;
005A1E03  mov         eax,dword ptr [i]  //把i的值放到eax寄存器里面
005A1E06  add         eax,1              //eax的值+1,结果放到eax中
005A1E09  mov         dword ptr [i],eax  //eax的值给i
005A1E0C  mov         ecx,dword ptr [i]  //i的值给ecx寄存器
005A1E0F  mov         dword ptr [j],ecx  //ecx的值给j

说明我们的想法是对的,那我们就可以的得到结论了

结论
  • 前置++,先++,后使用
题外话

关于结合性和优先级的问题,我们不说,原因是这些运算符太多了,很难记得很详细,我们可以使用“()”进行逻辑上的处理,或者是查表。

要是有人让你去分析下面的一个代码,你可以让他爬 !!!

#include

int main()
{

	int i = 1;
	int j = i++ + ++i + i++;
	printf("%d", j);
	return 0;
}

因为不同的编译器对这个代码的解释是不一样的

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5670180.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存