こんばんは。
日本電子専門学校OSS科の高尾と申します。

Rubyに特別な話ではないのですが、ここが最も投稿しやすそうなので
こちらで質問をさせて頂きます。

昔、整数が格納された二変数を一時変数を使わずにスワップするという
賢いコードのことを知りました。

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では期待したようには動きませんでした。
(例えばa=1, b=2のとき実行するとa=0, b=1となる)
一方CやPHPでは期待通りに動きました。

目で追う分には同じ処理のように思えるのですが
なぜJavaやRubyでは前者/後者で違う結果になってしまうのでしょうか?