[#46732] ヒアドキュメント内の変数展開が正常に行われない — ShingoKintaka <kamuycikap@...>

Ruby  :1.8.7 (Ubuntu9.10)

12 messages 2010/01/05
[#46733] Re: ヒアドキュメント内の変数展開が正常に行われない — rubikitch@... 2010/01/06

From: ShingoKintaka <kamuycikap@tulip.ocn.ne.jp>

[#46800] DLモジュールの使い方 — kouichi_someya@...

染谷と申します。

12 messages 2010/01/20
[#47678] プログラム実行時に「[BUG] Segmentation fault」 — 染谷 康一 <kouichi_someya@...> 2010/12/09

染谷と申します。

[ruby-list:46822] Re: 整数が格納された二変数を一つの式でスワップするコードのふるまいについて

From: Yukihiro Matsumoto <matz@...>
Date: 2010-01-28 00:13:38 UTC
List: ruby-list #46822
まつもと ゆきひろです

In message "Re: [ruby-list:46820] 整数が格納された二変数を一つの式でスワップするコードのふるまいについて"
    on Thu, 28 Jan 2010 04:02:37 +0900, m_takao <threewayhandshake@gmail.com> writes:

|昔、整数が格納された二変数を一時変数を使わずにスワップするという
|賢いコードのことを知りました。
|
|a = a ^ b
|b = a ^ b
|a = a ^ b
|
|このコードはCでもPHPでも、JavaでもRubyでもきちんと動きました。
|(例えばa=1, b=2のとき実行するとa=2, b=1となる)
|ところが、これを一つの式にまとめて
|
|a = a ^ (b = (a = a ^ b) ^ b)
|
|と書いたものは、JavaやRubyでは期待したようには動きませんでした。

評価順が異なるからではないでしょうか。Rubyではオペランドは左
から右に評価すると定められています。一方、Cでは評価順序は実装
依存です。

さて、上記のスワップをa,bそれぞれの値を変数を再利用しないで
表記すると、以下のようになります。

a1 = a0 ^ b0
b1 = a1 ^ b0
a2 = a1 ^ b1

同様に、ひとつの式にまとめた形式は

a2 = a0 ^ (b1 = (a1 = a0 ^ b0) ^ b0)

となり、元の形式に戻すと

a1 = a0 ^ b0
b1 = a1 ^ b0
a2 = a0 ^ b1  # ここが違う

です。CやPHPで期待通りに動作したのは、わりと偶然でしょう。

                                まつもと ゆきひろ /:|)

In This Thread