白豚 发表于 2016-5-31 21:21:22

自增自减

#include <stdio.h>

void main()
{
        int x = 8, y = 9, p, q, i = 5, ;

        p = (x++) + (y++) + (x++);
        printf("%d\n", x);
        q = (++x) + (++x) + (++x);
        printf("%d, %d, %d, %d, %d\n", p, q, x, y, i);
        printf("%d\n", i);
}
结果:
10
25, 37, 13, 10, 5
5
Press any key to continue
这个结果我感觉不对啊,q=37怎么来的?

黄大大丶 发表于 2016-5-31 22:10:15

有点疑惑

n0noper 发表于 2016-6-1 09:08:17

在别的游戏里,像我这么帅的,一般都是主角哟~~~

Debug 模式

26:         q = (++x) + (++x) + (++x);
0040D785   mov         edx,dword ptr
0040D788   add         edx,1
0040D78B   mov         dword ptr ,edx
0040D78E   mov         eax,dword ptr
0040D791   add         eax,1
0040D794   mov         dword ptr ,eax
0040D797   mov         ecx,dword ptr
0040D79A   add         ecx,dword ptr
0040D79D   mov         edx,dword ptr
0040D7A0   add         edx,1
0040D7A3   mov         dword ptr ,edx
0040D7A6   add         ecx,dword ptr
0040D7A9   mov         dword ptr ,ecx

解析:x = 10;
1. ++x -> x = 11;
2. ++x -> x = 12;
3. x+x -> 计算前两个x的计算结果 = 24
4. ++x -> x = 13;
5. 所有结果汇总:: 24 + 13 = 37

Release 模式

【最快速度】/【最小大小】
00401000 >push    0A                               ; /<%d> = A (10.)
00401002push    00408044                         ; |format = "%d",LF,""
00401007call    printf                           ; \printf
0040100Cadd   esp, 8
0040100Fpush    5                              ; /<%d> = 5
00401011push    0A                               ; |<%d> = A (10.)
00401013push    0D                               ; |<%d> = D (13.)
00401015push    27                               ; |<%d> = 27 (39.)
00401017push    19                               ; |<%d> = 19 (25.)
00401019push    00408030                         ; |format = "%d, %d, %d, %d, %d",LF,""
0040101Ecall    printf                           ; \printf
00401023add   esp, 18
00401026push    5                              ; /<%d> = 5
00401028push    00408044                         ; |format = "%d",LF,""
0040102Dcall    printf                           ; \printf
00401032add   esp, 8
00401035retn

解析:解析你妹啊!Release版本直接把结果出来了,没有计算过程的好伐?! q是39啊,自己脑补 -_- (提示:先完成三个自增后加运算)

【默认】
26:         q = (++x) + (++x) + (++x);
00401053   mov         edx,dword ptr
00401056   add         edx,1
00401059   mov         dword ptr ,edx
0040105C   mov         eax,dword ptr
0040105F   add         eax,1
00401062   mov         dword ptr ,eax
00401065   mov         ecx,dword ptr
00401068   add         ecx,dword ptr
0040106B   mov         edx,dword ptr
0040106E   add         edx,1
00401071   mov         dword ptr ,edx
00401074   add         ecx,dword ptr
00401077   mov         dword ptr ,ecx


解析:这个跟Debug模式一样,没有啥优化。


DAY 发表于 2016-6-1 23:01:33

大神就是不一样,,,,,

xhbsingle 发表于 2016-6-1 23:41:51

学习

离子云 发表于 2016-6-1 23:43:52

看汇编代码,这是编译器的问题

xls6688 发表于 2016-6-2 02:43:12

看看{:5_92:}

香蕉你个不娜娜 发表于 2016-6-2 22:30:47

本帖最后由 香蕉你个不娜娜 于 2016-6-2 22:36 编辑

我还是不懂24是怎么来的

巨龙B 发表于 2016-6-7 12:24:42

学习下

巨龙BI 发表于 2016-6-7 12:29:16

看看

XCV5 发表于 2016-6-7 12:44:05

为什么我觉得q == 11 + 12 + 13 ==36

人造人 发表于 2016-6-9 19:15:41

纠结这个没有意义,不同的编译器结果不同(书上说的),以后的开发中不要使用这样的代码,除非你不想自己的程序可移植
页: [1]
查看完整版本: 自增自减