日期:2014-05-18  浏览次数:20829 次

为什么同一条语句,C和C#运行的结果不一样~~~
int i = 3;
i += i++;

C语言
printf("i = %d\n", i);
结果:i=7;


C#
Console.WriteLine("i = {0}", i);
结果:i=6;

求解释新人,刚刚学编程,还不懂得这么看反汇编~~~

------解决方案--------------------
i += i++;
简单来说这个过程分几步,
1,执行 i+= 操作,其实就是把i的值先取出来放入寄存器,此时i=3,寄存器1中是3,然后再把表达式右侧的值计算出来.
2,执行i++操作的第一步,取值把i的值取出来,放到寄存器中 此时 i==3 ,寄存器2中也是3.
3,执行i++操作的第二部,累加,此时i==4,不过要注意,刚才放到寄存器1和2中的值还是3.
4,把第一步中寄存器1里的3和第二部中寄存器2中的3相加,赋值给i.此时,i从4变成了6.
这是C#的出来方式
------解决方案--------------------
你这个问题本身是错的。

i+=i++;对于C语言来说是规范没有指示的,因此不同的C语言编译器可以允许不同的结果。这取决于它们优化和实现的需要。也就是说,不存在“C运行结果”这么个概念,要看具体的编译器以及版本还有配置。

估计你就试验了VC++吧。
------解决方案--------------------
对于.net来说 执行自增操作的时候 会将需要自增的值复制一份入栈 而++在前还是在后则决定了这个复制是发生在自增之前还是之后 如果是i++ 则会导致复制出来的值+1而原始值没有+1 最后出栈的顺序导致了一个为自增的值而另一个为没有自增的值 反之 对于++i 由于复制操作发生在相加操作之后 所以栈顶两个元素都为自增后的值
对于C 我汇编不是特别熟 就知道编译后好像直接有个自增的汇编指令的 没有C#这样出入栈的过程