未定義値?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の乗算をしてしまう、ってことなのかな?