楼上的有个问题我很想不明白 为什么交换数字用 a-=b;b+=a;a=b-a; ? 无论从可读性,和运行速度上,你这都是走下策(用于加密或许有一点点迷惑别人的意思) 下面是int c=a;a=b;b=c;VC编译后的指令 int a=12,b=21;
% I" d" f0 X$ H2 O/ g4 n' G' Lmov dword ptr [ebp-4],0Ch$ ^4 M4 C5 z0 h& P& ]) f+ u
mov dword ptr [ebp-8],15h+ f5 N' U0 o" e
int c=a;
6 n- J1 E- n7 j) u2 _mov eax,dword ptr [ebp-4]
: |7 J, ?( I6 i2 e" W+ t0 z- \8 j- [9 z9 Hmov dword ptr [ebp-0Ch],eax
! ]$ W3 t! ]$ B d, N8 `# t a=b;. C5 S/ w7 y6 b8 L3 a1 E2 e5 q+ f8 e
mov ecx,dword ptr [ebp-8]( ^/ _% [; ~) q0 w$ j& C
mov dword ptr [ebp-4],ecx
* \$ M! h5 D2 s5 R! W( Z b=c;) W8 m3 \3 v0 F: J. o+ C! [# G
mov edx,dword ptr [ebp-0Ch]' f; u, M2 L" ~/ v" @( Q; l' R7 W
mov dword ptr [ebp-8],edx 下面是你的方法VC编译后的指令 a=12,b=21;
2 G. B, \+ }+ s( n5 @1 d) `" Tmov dword ptr [ebp-4],0Ch
8 P0 X" m) U( X7 ymov dword ptr [ebp-8],15h, y; W+ o1 q) A
a-=b;- ?% V. ]" j- O- ]* K; X
mov eax,dword ptr [ebp-4]! r7 z$ R& H0 \# V
sub eax,dword ptr [ebp-8]
+ P$ d6 p1 X9 f( emov dword ptr [ebp-4],eax
+ ~4 o) y" l1 X b+=a;# ? B) x# q% T8 O& o4 m0 k
mov ecx,dword ptr [ebp-8]' B; g+ _% q; s" [0 J
add ecx,dword ptr [ebp-4]' Q* s' L" w' e+ X% ^
mov dword ptr [ebp-8],ecx
* o# b m; _9 y a=b-a;9 r: @) R3 T# G9 L. ~
mov edx,dword ptr [ebp-8]! y0 U4 K4 x& {# [
sub edx,dword ptr [ebp-4]
: ], f1 t o, Q/ X! W3 Ymov dword ptr [ebp-4],edx
: W* M0 B1 P) l& ]1 l; L8 w0 A7 h 很明显正规方法只有8条Mov指令, 而你的方法有8条Mov指令和2条Sub指令和1条Add指令 要知道,和Mov指令比起来Sub指令,Add指令是很费时间的! |