未定義値?undefじゃなくて?
諸事情により再帰プログラム。何年ぶりだ。
sub mul { my $arg = shift; if($arg == 0) { return 1; } else { return $arg * mul($arg - 1); } }
動くんだけど。最後を
return $arg * mul(--$arg);
とすると期待している動作をしない。納得いかなかったので調べてたら、なんかC言語のページに辿り着いた。
$B=i5i(JC$B8@8l(JQ&A(7)
つまり一行の中で、値を評価するのとインクリメントorデクリメントを同時にすると、どっちが先に評価されるかが未定義だと。
未定義ってのは不定ってわけじゃなく、動作が保証されていないと。今の環境じゃ決まった動作をしても、バージョンアップしたら保証しないよ、と。
とりあえずこの件は、returnの直後にある方の$argが先に0になって、0の乗算をしてしまう、ってことなのかな?