xiawiner 发表于 2015-11-9 19:02:53

i++和i--例题遇到的困扰,求解答。

本帖最后由 xiawiner 于 2015-11-9 19:26 编辑

#include <stdio.h>

void main()
{
        int i = 8;

        printf("%d\n%d\n%d\n%d\n%d\n%d\n", ++i,--i , i++, i--, -i++, -i--);

}


以上是代码,输出后的结果依次是:8878-7-8 。

例题说不同的编译系统不一定相同,可以从左到右,也可以从右到左。这道题如果按从右到左的顺序的话,第二个--i的值不应该等于8啊?如果从左到右更不对了,真的很头疼。不知道问题出在哪,希望有大虾能够详细的解答下,:cry

xiawiner 发表于 2015-11-9 19:25:40

顶起来,没有解决啊,手残点错了。、。

~风介~ 发表于 2015-11-9 20:03:54

好像的确如此!搞不明白呀~{:7_138:}

xiawiner 发表于 2015-11-10 07:23:01

本帖最后由 xiawiner 于 2015-11-10 07:43 编辑

~风介~ 发表于 2015-11-9 20:03
好像的确如此!搞不明白呀~

管理大大,问题到底出在哪啊,我看你的答案是正确的,到底怎么回事啊。我的推断没有错,但是怎么调试就不一样了,编译器的问题还是有哪些细节没有掌握啊?不能悬赏,不好意思。谁会谁教我,悬赏+此例题。

xiawiner 发表于 2015-11-10 08:16:56

已测试,换了编译器,还是错误的结果。

~风介~ 发表于 2015-11-10 09:40:58

//VS2013下反汇编        
printf("%d\n%d\n%d\n%d\n%d\n%d\n", ++i,--i , i++, i--, -i++, -i--);
010113E5 8B 45 F8             mov         eax,dword ptr
010113E8 F7 D8                neg         eax
010113EA 89 85 30 FF FF FF    mov         dword ptr ,eax
010113F0 8B 4D F8             mov         ecx,dword ptr
010113F3 83 E9 01             sub         ecx,1
010113F6 89 4D F8             mov         dword ptr ,ecx
010113F9 8B 55 F8             mov         edx,dword ptr
010113FC F7 DA                neg         edx
010113FE 89 95 2C FF FF FF    mov         dword ptr ,edx
01011404 8B 45 F8             mov         eax,dword ptr
01011407 83 C0 01             add         eax,1
0101140A 89 45 F8             mov         dword ptr ,eax
0101140D 8B 4D F8             mov         ecx,dword ptr
01011410 89 8D 28 FF FF FF    mov         dword ptr ,ecx
01011416 8B 55 F8             mov         edx,dword ptr
01011419 83 EA 01             sub         edx,1
0101141C 89 55 F8             mov         dword ptr ,edx
0101141F 8B 45 F8             mov         eax,dword ptr
01011422 89 85 24 FF FF FF    mov         dword ptr ,eax
01011428 8B 4D F8             mov         ecx,dword ptr
0101142B 83 C1 01             add         ecx,1
0101142E 89 4D F8             mov         dword ptr ,ecx
01011431 8B 55 F8             mov         edx,dword ptr
01011434 83 EA 01             sub         edx,1
01011437 89 55 F8             mov         dword ptr ,edx
0101143A 8B 45 F8             mov         eax,dword ptr
0101143D 83 C0 01             add         eax,1
01011440 89 45 F8             mov         dword ptr ,eax
01011443 8B F4                mov         esi,esp
01011445 8B 8D 30 FF FF FF    mov         ecx,dword ptr
0101144B 51                   push      ecx
0101144C 8B 95 2C FF FF FF    mov         edx,dword ptr
01011452 52                   push      edx
01011453 8B 85 28 FF FF FF    mov         eax,dword ptr
01011459 50                   push      eax
0101145A 8B 8D 24 FF FF FF    mov         ecx,dword ptr
01011460 51                   push      ecx
01011461 8B 55 F8             mov         edx,dword ptr
01011464 52                   push      edx
01011465 8B 45 F8             mov         eax,dword ptr
01011468 50                   push      eax
01011469 68 CC 59 01 01       push      10159CCh
0101146E FF 15 14 91 01 01    call      dword ptr ds:
01011474 83 C4 1C             add         esp,1Ch
01011477 3B F4                cmp         esi,esp
01011479 E8 B8 FC FF FF       call      __RTC_CheckEsp (01011136h)

淡雅夏伤 发表于 2015-11-10 09:43:45

编译器的问题,不用纠结这种问题,我的gcc和你的输出一样,C99

~风介~ 发表于 2015-11-10 09:43:55

不同编译器对语句的具体实现有差别,进而可能得出匪夷所思的结果。
想了解其中的缘由,需要你自己去看代码的反汇编。(原谅我看不懂以上反汇编~{:7_138:})@阴影中的曙光 @仰望天上的光

~风介~ 发表于 2015-11-10 09:47:43

如果想要防止该问题,可以参考以下写法~
#include <stdio.h>

int main()
{
        int i = 8;

        printf("%d\n%d\n%d\n%d\n%d\n%d\n", ++i,--i , i++, i--, -i++, -i--);

        /*
        printf("%d\n", i);
        ++i;
        printf("%d\n", i);
        i = 8;
        --i;
        printf("%d\n", i);
        i = 8;
        i++;
        printf("%d\n", i);
        i = 8;
        i--;
        printf("%d\n", i);
        */

        /*
        printf("%d\n", ++i);
        i = 8;
        printf("%d\n", --i);
        i = 8;
        printf("%d\n", i++);
        i = 8;
        printf("%d\n", i--);

        getchar();
        */

        return 0;
}

xiawiner 发表于 2015-11-10 11:12:11

~风介~ 发表于 2015-11-10 09:47
如果想要防止该问题,可以参考以下写法~

谢谢管理大大。昨天我也试了看反汇编,无奈看不懂。才来求助。。谢谢。

xiawiner 发表于 2015-11-10 11:14:45

淡雅夏伤 发表于 2015-11-10 09:43
编译器的问题,不用纠结这种问题,我的gcc和你的输出一样,C99

好的,谢谢你

阴影中的曙光 发表于 2015-11-10 13:08:12

--i,和++i当行生效,i--和i++次行生效,理解好这个就行,当然这种题最蛋疼,反汇编给跪了

zhangyuge 发表于 2015-11-10 22:20:24

看过一眼裘宗燕老师的书,说避免这种用法,要不就用括号。

q312102408 发表于 2015-11-13 18:27:54

小驾驭说过 ,不要纠结这个问题,不同的编译器,算出来的都不一样.再说了 ,你做程序时根本用不到这么长 .

不要在这上面消耗精力了

zzxtcx1314520 发表于 2015-11-13 20:35:17

纠结这些没个卵用的问题干嘛。
页: [1]
查看完整版本: i++和i--例题遇到的困扰,求解答。