楼上的有个问题我很想不明白 为什么交换数字用 a-=b;b+=a;a=b-a; ? 无论从可读性,和运行速度上,你这都是走下策(用于加密或许有一点点迷惑别人的意思) 下面是int c=a;a=b;b=c;VC编译后的指令 int a=12,b=21;/ k- |0 h# F0 v2 v: g; R. y* b
mov dword ptr [ebp-4],0Ch7 g9 w- B h e- E, W
mov dword ptr [ebp-8],15h
/ y: D( G. r% @# C7 ? int c=a;
5 {5 I' j- t4 Cmov eax,dword ptr [ebp-4]" T$ F! B* r! `) x
mov dword ptr [ebp-0Ch],eax
4 _( X5 q7 q2 Z" T a=b;
& I" G' z9 T+ w$ Z mov ecx,dword ptr [ebp-8]/ R( `& z" I% l I( ~0 m
mov dword ptr [ebp-4],ecx
' r' p7 A- S! Z* W3 Q+ Z" f# \" W7 i b=c;
# S, X3 `$ `* M& f/ x6 Y% z- G, gmov edx,dword ptr [ebp-0Ch]& G8 `+ m; P, R7 H) h6 `
mov dword ptr [ebp-8],edx 下面是你的方法VC编译后的指令 a=12,b=21;
2 j2 W2 y' ^' T8 j' H2 e3 Qmov dword ptr [ebp-4],0Ch0 W' G8 K; z* l: h; d, U$ X5 Z% v1 n
mov dword ptr [ebp-8],15h
8 |% D% S( t4 i a-=b;
3 Y( [8 h2 p5 j( nmov eax,dword ptr [ebp-4]" q8 y4 X% W9 B" t3 Y" w
sub eax,dword ptr [ebp-8]
, L0 ?' t' m# R1 k& m( W5 I6 p4 Z% {mov dword ptr [ebp-4],eax
$ ^1 j6 L( L y b+=a;
+ s8 _# E3 `: t9 X. k4 b" Ymov ecx,dword ptr [ebp-8]/ K0 s5 K; u2 |' V5 O9 H4 J
add ecx,dword ptr [ebp-4]# e& O0 c3 K/ F3 p! B
mov dword ptr [ebp-8],ecx, O! \+ j7 E9 u. ]
a=b-a;
, p" Y2 U# O; N$ Amov edx,dword ptr [ebp-8]) o# z% G/ X2 N$ m; d
sub edx,dword ptr [ebp-4]
4 Z- L, I: j! B. ]$ Mmov dword ptr [ebp-4],edx5 Q3 W# k% \& U7 j
很明显正规方法只有8条Mov指令, 而你的方法有8条Mov指令和2条Sub指令和1条Add指令 要知道,和Mov指令比起来Sub指令,Add指令是很费时间的! |