[ruby-list:50859] Re: [質問]自己代入を繋げた場合の動作について
From:
Shugo Maeda <shugo@...>
Date:
2019-12-26 08:38:07 UTC
List:
ruby-list #50859
前田です。 On Thu, 26 Dec 2019 16:56:15 +0900 Nobuyoshi Nakada <nobu@ruby-lang.org> wrote: > >> aをIntegerの変数として、1を代入した状態で > >> a += a += a += a += 5 > >> を実行してからaを出力すると期待する出力は48ですが実際には9が出力されます。 > >> 48の根拠は(5+1)*2*2*2=48ということと、Cを含む他の言語で48になるということです。 > > > 少なくともCでは、同じ変数に対する副作用が複数ある式の結果は未定義だったはずです。 comp.lang.cのFAQでもSCO Optimizing C compilerではXOR swapの例は動かな いと書いてありますね。 http://c-faq.com/expr/xorswapexpr.html 結果が48になるような言語がないかなと思って軽くみたのですが、Perlと Pythonが該当するようです。 C#: 9 Java: 9 JavaScript: 9 Perl: 48 PHP: 48 Python: a += 5は文なので文法エラー Scala: a += 5の型がUnitなので型エラー Sather: a += 5は文なので文法エラー Go: a += 5は文なので文法エラー Perlのマニュアルには評価順序の言及はなさそうです(関係ないですがPerlの 場合はCと違って左辺値なのですね)。 https://perldoc.perl.org/5.30.0/perlop.html#Assignment-Operators PHPの方も言及がありませんがPerlに倣ったのでしょうか。 https://www.php.net/manual/en/language.operators.assignment.php 詳細をご存知の方がいたら教えてください。