首先,这个与具体的编译器无关,任何C编译器运算的结果都应当为25。
.
我写了一段测试代码,环境为VC6 + Debug方式:
程序代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a = 5, b;
b = ++a*--a;
printf("b=%d\n", b);
return 0;
}
我们反汇编 b = ++a*--a;这段代码,并跟踪调试和作注释:
8:
b = ++a*--a;
0040102F
mov
eax,dword ptr [ebp-4] ; [ebp-4]就是变量a,这行把a的值(5)给寄存器eax
00401032
add
eax,1
; eax + 1 = 5 + 1 = 6
00401035
mov
dword ptr [ebp-4],eax ; 然后又把6放回到变量a处,这样一来a = 6
00401038
mov
ecx,dword ptr [ebp-4] ; 接着把a的值6又给了寄存器ecx
0040103B
sub
ecx,1
; ecx - 1 = 6 - 1 = 5
0040103E
mov
dword ptr [ebp-4],ecx ; 把5又赋值给变量a
00401041
mov
edx,dword ptr [ebp-4] ; 又把a的值5给了寄存器edx
00401044
imul
edx,dword ptr [ebp-4] ; edx * a = 5 * 5 = 25 = edx
00401048
mov
dword ptr [ebp-8],edx ; [ebp-8]就是变量b,这一步把edx的值(25)给变量b
9:
printf("b=%d\n", b);
.
上面反汇编的这段代码说明了变量a的值的变化过程就是先增加1变为6,然后又减1变回5,然后再5*5。所以,最终结果为25,而不是30的原因。
[
本帖最后由 prankmoon 于 2009-9-4 22:31 编辑 ]