河野真治 @ 琉球大学情報工学です。

In article <cj0jmr$s0m$1@caraway.media.kyoto-u.ac.jp>, <kounoike@mbh.nifty.com> writes
> なぬ!破壊代入ってそうゆうことを指していたんですか。となると,変数
> への代入は全て破壊代入と呼べると思いますが,わざわざ破壊を付け
> なくても単なる代入で十分な気がします。引数付きの関数呼び出しなん
> かこれなしで実現できそうもないし。そんな言葉を作る必要性があるの
> か私には理解できません。

それは、ちょっと違う。最初の代入だけが特別扱いされるってな感じですね。
値を書き換えるのがだめなわけ。

      ・- ・- ・- ・- ・- nil
      |    |   |   |   |
      a    b   c   d   e

ってのが良くある線形リストなんですけど、

      x           y
      |           |
      v           v
      ・- ・- ・- ・- ・- nil
      |    |   |   |   |
      a    b   c   d   e

というように変数に参照が代入されているとしますよね。

     *x  ==  (a b c d e)
     *y  ==  (d e)

に見えるわけなんだけど、

     *y = (f g)

みたいな代入をすると、

     *x == (a b c f g)

と x も変わってしまう。これは破壊的な代入です。

      x           y
      |           |
      v           v
      ・- ・- ・- ・- ・- nil
      |    |   |   |   |
      a    b   c   f   g

*x に影響を与えないようにするには、

     *y の指している先を新しく作ってから、代入してやる

ってことをします。

      x           y
      |           |
      |           v
      |           ・- ・- nil
      |            |   |
      |            f   g
      v
      ・- ・- ・- ・- ・- nil
      |    |   |   |   |
      a    b   c   d   e

ってな感じ。

この違いを理解するには、ポインタを知らないと無理ってな話。

---
Shinji KONO @ Information Engineering, University of the Ryukyus
河野真治 @ 琉球大学工学部情報工学科