- 4
- 0
- 约6.7千字
- 约 7页
- 2016-12-21 发布于河南
- 举报
关于i++和++i的答疑
void main()
{
int i=8;
printf(%d,%d,%d,%d\n, ++i, --i, i++, i--);
}
TC2.0编译的结果是:8,7,7,8
VC6编译的结果是:8,7,8,8
VS2005编译的结果是:8,8,7,8
这里我们可以看到,由不同的编译器产生了不同结果,可见这个问题是依赖编译器的理解和实现的。换句话说,对于i++和++i的处理本来就是非常具有歧义的,当然在自己应用中我相信也不会有任何程序员写出这样歧义的代码。但是作为一个问题,我们有必要分析一下不同编译器究竟如何理解i++和++i操作符的。
我们在学习C的时候,应该已经知道了i++和++i两者的区别,即“++”符号在i之前还是之后,决定了i自增操作和他的语句的执行顺序的关系。即i++,理解为i在其语句中取原始值,++i在其语句中取自增后的新值。这一点是毫无疑义的。但是问题在于,i++和++i在作为函数参数的时候,和进入调用堆栈的顺序之间有何关系呢?根据前面的程序结果,可见各个编译器的处理不同,那么造成这种不同的结果的原因是什么呢?我们从代码上无法看到差异,因此我们必须看汇编语言才能知晓,编译器到底把我们的代码翻译成了什么?
一、VC6函数调用分析
; int i=8;
mov DWORD PTR _i$[ebp], 8 ;
原创力文档

文档评论(0)