Nisy 发表于 2009-5-9 02:38:44

关于一个变量自加运算中出现的问题

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语言中的问题大家直接在本版块提问即可

HDd1145 发表于 2009-5-9 08:32:27

unpack 发表于 2009-5-9 11:02:51

在谭浩强的书中有这么一段



所以我们还是避免去写这样的程序吧,编译器有区别

chensn 发表于 2009-5-9 12:11:26

/:L
支持下

crackiss 发表于 2009-5-9 12:12:43

++i 和 i++ 一直有点混乱。。每次看清楚了 再去做 也还有点。。。这次也要好好搞清楚

popo2008 发表于 2009-5-9 12:31:03

是挺混乱的~~~哈哈·~~谢谢大虾们的提醒·~哈哈·

zjid520 发表于 2009-5-9 12:42:49

讲得很明白了,感谢!

skiy 发表于 2009-5-9 12:47:54

刚才在群里理清了一题。。。呵呵!/:001

kelvar 发表于 2009-5-10 10:45:07

感觉unpack的回答的最好,
这东西主要是跟各个编译器的自定义有关系。以前也见到过参数入栈顺序也有这种问题
所以编译的时候要注意自己所用的编译器的厂家

千江月 发表于 2009-5-10 15:03:58

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
查看完整版本: 关于一个变量自加运算中出现的问题