栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

重点讲解 i++ 和 ++i

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

重点讲解 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;
}

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/664074.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号