- 序言
- 为什么会有自增运算符
- ++等于+1吗?
- 后置++
- 样例一
- 样例二
- 汇编代码
- 结论
- 前置++
- 样例一
- 样例二
- 汇编代码
- 结论
- 题外话
为什么会有自增运算符在语言学习中,我们都会遇到很多将变量加一的情况,我们为了简便创造出了自增(+1)和 自减(-1)运算符,也就是++ 和 --,今天我们就以 ++ 为例,来详细的说一下。
++等于+1吗?++运算符在B语言中就被创立的,C语言继承了他,我们大量使用的原因是他们简洁和便利,他们现在并不会使得程序变得更短或更快。
首先,我们先肯定一件事 ++可以得到 *** 作数+1的效果
#includeint 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; }
#includeint main() { int i = 0; int j = i++; printf("%dn", j); printf("%dn", i); return 0; }
这就出现问题了,我们要好好的考虑一下了
汇编代码i++的意思是 现在先使用i的值,稍后再在自增i,这就有有意思了,稍后是多久?很抱歉C语言标准中没有给出精确的时间,但是我们可以放心的认为再下一条语句前就完成了自增。
#includeint 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; }
#includeint 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
结论说明我们的想法是对的,那我们就可以的得到结论了
- 前置++,先++,后使用
关于结合性和优先级的问题,我们不说,原因是这些运算符太多了,很难记得很详细,我们可以使用“()”进行逻辑上的处理,或者是查表。
要是有人让你去分析下面的一个代码,你可以让他爬 !!!
#includeint main() { int i = 1; int j = i++ + ++i + i++; printf("%d", j); return 0; }
因为不同的编译器对这个代码的解释是不一样的
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)