Cばらばら_swap()の実現に関するいくつかの方法
3999 ワード
intタイプを例にとります.
1:
1つ目は,中間変数を用いて数値交換を行うのが最も一般的である.
2番目と3番目は中間変数を利用しない.
2:
この方法はコンパイラに関連しており,推奨せず,理解するだけでよい.
3:
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:
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 }