Cばらばら_swap()の実現に関するいくつかの方法

3999 ワード

intタイプを例にとります.
1:
1 int tmp, left, right;

2 tmp = letf;

3 left = right;

4 right = tmp;

1つ目は,中間変数を用いて数値交換を行うのが最も一般的である.
2番目と3番目は中間変数を利用しない.
 
2:
1 int left, right;

2 left = left + right - (right = left);

この方法はコンパイラに関連しており,推奨せず,理解するだけでよい.
 
3:
1 int left, right;

2 left = left ^ right;

3 right = left ^ right;

4 left = left ^ right;

3つ目はかなり理解しにくいですが、C言語のビットと論理を使っているので、分解して見ることができます.
2行目のコードが走り終わると、left=left^right、3行目はright=left^right^rightとなります.演算の特性(同じ0,異なる1)と交換則から3行目の実際の結果はright=letfであることがわかる.
さらに4行目のleft=left^rightまで、同様に代入して、left=left^right^leftを得て、同様にletf=rightを得ます.
この方法は簡単で実行可能で、お勧めします.ただしintタイプの数値交換にのみ適用されます.
 
2013.5.1補足:
マクロ定義の方法も使用できます.これからファイルストレージ関数の練習を開始するため、マクロ定義はヘッダファイルに配置され、使用するグローバル変数はmain関数の前に定義されます.
 1 //test.h

 2 #include <stdio.h>

 3 #include <stdlib.h>

 4 extern int tmp; //       ,         ,       .c              

 5 #define SWAP(a, b) do{\

 6                                   tmp = (a);\

 7                                    (a) = (b);\

 8                                    (b) = tm;\

 9                                   }while(0)

10 

11 

12 //test.c

13 int tmp;

14 

15 int main(int argc, char* argv[])

16 {

17    int a = 1, b = 2;

18    SWAP(a, b)

19    return 0;

20 }