swap色々
ちょっとした小ネタです。
Cでswapをするには、マクロやポインタを使えば出来ます。
// int値の交換 #include <stdio.h> void swap(int* a, int* b) { int t = *a; *a = *b; *b = t; } int main(void) { int a = 0, b = 1; printf("%d, %d\n", a, b); swap(&a, &b); printf("%d, %d\n", a, b); return 0; }
C++でswapをする場合は、Cでの方法に加え、STLのalgorithmにtemplateと参照を使った実装が入ってます。
#include <iostream> #include <algorithm> using namespace std; int main() { int a = 0, b = 1; cout << a << ", " << b << endl; swap(a, b); cout << a << ", " << b << endl; return 0; }
C#ではunsafeやrefを使えばできるようですが、残念ながらJavaではプリミティブ型についてはスマートには出来ません。
では、Pythonの場合は?
a, b = 0, 1 a, b = b, a
超シンプルですね。これが可能なのは、カンマ区切りが暗黙でtupleになるからですね(参考:リストへの代入)。
Rubyも同じ感じでできます。多重代入という言語的なサポートによるものです。
a, b = 0, 1 a, b = b, a
Perlの場合は、右辺左辺を丸括弧でくくって配列にすれば出来ます。
my ($a, $b) = (0, 1); ($a, $b) = ($b, $a);
この辺り、見た目は似ていますが、仕組みは違うところが面白いですね。
ちなみに、JavaScriptの場合は、多重代入的なものは無いのですが、こんなワンライナーの方法があるのだとか。
var a = 0, b = 1; a = [b, b = a][0];
言われてみれば確かにそうなのですが、、、ちょっとキモいですね。