关于一个变量自加运算中出现的问题
main( ){
int i=3,k;
k = (((++i)+(++i))+(++i));
printf("%d\n",k);
}
这个东西 在Turboc和VC6的执行结果是不一样的
VC6 中是这样的 : 5+5+6 = 16
00401159|.C745 FC 03000>MOV DWORD PTR SS:,3 ; 就是K
00401160|.8B45 FC MOV EAX,DWORD PTR SS:
00401163|.83C0 01 ADD EAX,1 ;3+1
00401166|.8945 FC MOV DWORD PTR SS:,EAX ;4
00401169|.8B4D FC MOV ECX,DWORD PTR SS:
0040116C|.83C1 01 ADD ECX,1 ;4+1
0040116F|.894D FC MOV DWORD PTR SS:,ECX ;5 此时 =5
00401172|.8B55 FC MOV EDX,DWORD PTR SS:
00401175|.0355 FC ADD EDX,DWORD PTR SS: ;5+5
00401178|.8B45 FC MOV EAX,DWORD PTR SS:
0040117B|.83C0 01 ADD EAX,1
0040117E|.8945 FC MOV DWORD PTR SS:,EAX ;10+6
turboc 2.0 中是这样的:6+6+6 = 18
seg000:01BE mov si, 3 ; si = k =3
seg000:01C1 inc si
seg000:01C2 inc si
seg000:01C3 inc si
seg000:01C4 mov di, si ; si = k = 6
seg000:01C6 add di, si
seg000:01C8 add di, si
seg000:01CA push di
seg000:01CB push ds
seg000:01CC mov ax, 94h ; '?
seg000:01CF push ax ; format
seg000:01D0 call _printf
在处理自增运算时 尽量避免在一行指令中对同一变量进行自加运算 否则你将会很麻烦 不行你猜下面这行代码结果是多少:
main( )
{
int i=3,k;
k = ++i+i+++i+i ;
printf("%d\n",k);
}
昨天群里边问道的一个问题C语言中的问题大家直接在本版块提问即可 在谭浩强的书中有这么一段
所以我们还是避免去写这样的程序吧,编译器有区别 /:L
支持下 ++i 和 i++ 一直有点混乱。。每次看清楚了 再去做 也还有点。。。这次也要好好搞清楚 是挺混乱的~~~哈哈·~~谢谢大虾们的提醒·~哈哈· 讲得很明白了,感谢! 刚才在群里理清了一题。。。呵呵!/:001 感觉unpack的回答的最好,
这东西主要是跟各个编译器的自定义有关系。以前也见到过参数入栈顺序也有这种问题
所以编译的时候要注意自己所用的编译器的厂家 00401026|.F3:AB REP STOS DWORD PTR ES:
00401028|.C745 FC 03000>MOV DWORD PTR SS:,3 ;i=3,变量的初始化
0040102F|.8B45 FC MOV EAX,DWORD PTR SS: ;eax=3
00401032|.83C0 01 ADD EAX,1 ;eax+1==4
00401035|.8945 FC MOV DWORD PTR SS:,EAX ;4放入EBP-4这个地址中
00401038|.8B4D FC MOV ECX,DWORD PTR SS: ;ecx==4
0040103B|.83C1 01 ADD ECX,1 ;ecx+1==5
0040103E|.894D FC MOV DWORD PTR SS:,ECX ;ecx==5放入EBP-4这个地址
00401041|.8B55 FC MOV EDX,DWORD PTR SS: ;edx==5
00401044|.0355 FC ADD EDX,DWORD PTR SS: ;edx==5+5==10
00401047|.8B45 FC MOV EAX,DWORD PTR SS: ;eax==5
0040104A|.83C0 01 ADD EAX,1 ;eax+1==6
0040104D|.8945 FC MOV DWORD PTR SS:,EAX ;eax==6放入EBP-4这个地址
00401050|.0355 FC ADD EDX,DWORD PTR SS: ;edx==10+6
00401053|.8955 F8 MOV DWORD PTR SS:,EDX
想知道为什么是5+5,而不是4+5
页:
[1]
2