自增自减
#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怎么来的? 有点疑惑
在别的游戏里,像我这么帅的,一般都是主角哟~~~
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模式一样,没有啥优化。
大神就是不一样,,,,, 学习 看汇编代码,这是编译器的问题 看看{:5_92:} 本帖最后由 香蕉你个不娜娜 于 2016-6-2 22:36 编辑
我还是不懂24是怎么来的 学习下 看看 为什么我觉得q == 11 + 12 + 13 ==36 纠结这个没有意义,不同的编译器结果不同(书上说的),以后的开发中不要使用这样的代码,除非你不想自己的程序可移植
页:
[1]