Perl での 2 変数のスワップ.
my $a = 3; my $b = 2; ($a, $b) = ($b, $a);
と書くべきところを間違えて
$a, $b = $b, $a;
と書いてしまうと,$a も $b も変化しなくて悩むという話.
これを見て,一瞬ちょっと違った悩み方をした.
「ん? コンマ演算子はオペランドを左から順に評価して最後の値を返すから, = の左側の『$a, $b』は $b になって,右側の 『$b, $a』は $a になって,その結果 ($a, $b) == (3, 3) になるんじゃないの?」
もちろんそんなことはなくて,コンマ演算子より代入演算子の方が優先度が高いので,「$a」「$b = $b」「$a」が順に評価されて,結局変化無し,が正しい.
コンマと代入の優先順序なんて,普段から for 文とかで使いまくっててよく分かってるはずなのに,どうして勘違いしたんだろう,と考えてみたけど,たぶん「($a, $b) = ($b, $a);」の構造が先入観として作用して,頭が勝手に代入の前後それぞれをグルーピングしちゃったんだろうな,と理解した.
逆にいうと,C でうっかり
int a = 3; int b = 2; (a, b) = (b, a);
なコードを書くと,(3, 3) になっちゃうわけですな.(← どんなうっかりだ)
ついでに思い出した有名なやつ.(いや正確には,自力では思い出せなくてぐぐったのでメモしとく)
a = a ^ b; b = a ^ b; a = a ^ b;
これ最初に考えた人ってすごいよなあ.
最終更新時間: 2009-01-04 15:31