先看c语言的代码:
#include "stdio.h"
void budong(int a);
void main()
{
int i=3;
int g=0;
budong( i++ );
}
void budong(int a )
{
printf("%d",a);
}
它的反汇编代码如图所示:

看哪个红线框内,执行顺序是:
第1步——取出i的值,移动给寄存器eax 。
第2步——取出eax的值,移动到 机器内存为 【ebp-0Ch】 的位置。
第3步——取出【ebp-0Ch】那个个位置里面的值,移动给寄存器ecx 。
第4步——把ecx压入栈里。
相信大家都看的出来,这四个步骤,至少有两步是脱裤子放屁多此一举,比如,完全可以省略成【取出i的值,移动给寄存器eax,然后直接把eax压入栈里,完事。。。就像下面这张图片一样:

我想问的是:在调用函数budong时,为什么传递参数是i++时,机器会多运行一些可有可无的步骤【第2步和第3步】?它们的存在有什么意义??
------解决方案--------------------
缺省配置的Debug 版本,按部就班的执行,
C,C++语义,没有做优化。
有冗余代码是正常的。
缺省配置的Release 版本才会做优化。
VC缺省配置的Debug 版本,不做优化,严格按照C,C++代码的语义,编译。
从而保证 逻辑正确,语义正确。这是必要的。
这可以保证,不会有其他原因,引出的错误,干扰编译结果。
冗余代码消除,属于编译优化的工作,对Debug 版本,不是必要的。