[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

詳細をご存知の方がいたら教えてください。

In This Thread

Prev Next