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];

言われてみれば確かにそうなのですが、、、ちょっとキモいですね。