作者: うぇいく
日時: 2006/3/23(09:40)
 こんにちは。
----- Original Message -----
>Date: Thu, 23 Mar 2006 06:13:49 +0900
>From: davi <davi-1984@...>
>Subject: [TSfree:1538] 代入
>To: TSfree@...
>
>On Thu, 23 Mar 2006 01:25:35 +0900
>"Bruce." <kbk@...> wrote:
>
>> 多分、CGIでは有名なサイトのサンプルスクリプト
>
>を、そのまま貼り付けて使ってあります。
>
>よくよく探してみると、ミケネコさんも時間が2倍
>かかることを指摘していらっしゃいますね。
>
>さて、この件に関連して正規表現の初歩的な質問です。
>いつもしっくり来ないのでおせーてください。
>
>> $dest1 = $dest2 = $src;
>
>動作の順番は右端から左へ進んでゆくのでしょうか。
>つまり、日本語プログラム言語MINDじゃないけども、
>
>$src を $dest2 に 代入する。
>そして
>$dest2 を $dest1に代入する。
>
>こうなのでしょうか。それとも
>
>$dest1 は $dest2 である。
>そして
>$dest2 は $srcである。
>そこで、
>$srcの中身を$dest2に入れる。
>次いで
>$dest2の中身を$dest1に入れる。
>
>なのでしょうか。
使用している演算子の、結合方向と優先順位と項目数によるかと思われます。
代入演算子(=)は、右結合の2項演算子なので、
a=b
とあれば、aとbをそれぞれ評価し、両辺そろったら、演算(代入)します。
同じ優先順位・結合方向(右結合)の演算子がいくつも連鎖する場合、
右側から評価します。
# 右結合ですから。同じ優先順位で並んでいるなら、右側にあるほうが
# 優先順位がより高くなるわけです。
# a=3は、演算結果として「3」を返します。なので、a=b=3は、まず、b=3が
# 評価・実行されbに3が入ります。さらに、b=3の演算結果である3が、aに
# 入ります。

1+2+3という数式のちょうど逆だと思えばよいかと思います。
# 加算演算子は、左結合の2項演算子。1+2+3を、(1+2)+3と表現するなら、
# a=b=3は、a=(b=3)となります。

 なお、比較演算子の等号(==とか、===とかeqとか)は、左結合の2項演算子
である場合がほとんどですから、加算演算子のように左から評価されます。
# いつ参照されるか は、言語によって違う可能性があるので注意。評価の
# 順序と一緒とは限りません。

>「左辺の値をマッチングし、置換結果を代入」
>
>と、さらっと書いてありますが、身体感覚として「いつの
>段階で=の左辺の中身が=の右辺に入ったの?」と、しっくり
>来ないです。
 私の場合、とくに右辺に入るという感覚は無いですね・・・右辺に
持ってこないと演算できない という感覚もありません。
 たとえ、1つの変数の内容を複数回参照したとしても、あくまでも
1つの演算子であり、たとえ、別の表現に置き換えられるとしても、
それは別の話だと考えます。
# a=b=3は、演算子が2つありますから、どちらからどう評価するか
# というのを意識するのは重要です。しかし、「b=3」をもってきて、
# 内部的にどう処理するか は、実装依存です。1つの演算子に
# 対して、途中経過を想定することは出来ません。a+=3も同様。
 しいていうなら、左辺でも右辺でもない内部的なワークエリアに
おいておかれることになるかと思います(結果が です。演算する
ために、項目を移動する必要はありません。単に左辺を2度使用
(参照と設定)すればよいだけです。物理的な表記を書き換える必要は
ありません。)

# 1つの演算子を分解して理解しよう という時点でなにか別の方向に
# 行っちゃっている様な気が・・・・「理解するうえでこう考えるよう
# にしよう」というのは、理解を助ける上でよいかとは思いますが、
# 実際にどうなっているのか というのは、どーにもならないかと。
# ということはできても、


# ただ、代入演算子の考えは、Pythonにはあてはまらないかも知れません。
# あれは、代入ではなく、宣言なんだ というのをどっかでみたような?