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

In article <cj07cr$i4k$1@caraway.media.kyoto-u.ac.jp>, <kounoike@mbh.nifty.com> writes
> 質問するのがちょっと恥ずかしいのですが,破壊代入って何なんでしょうか。初めて耳にす
> る言葉なので。それと,プログラムには破壊代入が必要とはどうゆう意味なんでしょうか。
> 分かりやすく説明してもらえれば助かるのですが。

     int i;
     i = 1;
     printf("%d\n",i);

とかだと、i=1 で代入は行われているんですけど、特に前の値が壊れる
ってことはないんですよね。

ですけど、

     int i;
     i = 1;
     do {
         i = i + 1;
         printf("%d\n",i);
     } while( i< 10);

みたいなのだと、i に入っている前の値が上書きされてしまいます。それで
破壊代入とか言います。これを、

     loop1(int i) {
         if (i<10) {
              printf("%d\n",i);
              loop1(i+1);
         }
     }

とかすると、破壊代入抜きで同じことを実現することが出来ます。
(あんまり良い例じゃないけど...)

破壊代入なしだと、変数の値が一つ(これも正確な言い方じゃないけど..)
に決まるので、プログラム自体の理論的なわかりやすさみたいなのが
増します。しかし、一般的にはメモリ領域を多く食うとされています。

リスト処理でも、
       入力のリストを複製しながら、出力のリストを作る
というようにすると破壊代入抜きで出来ます。例えば、
       list 
       reverse(list in) {
           if (isNull(in)) return in;
           else return append(reverse(next(in)),first(in));
       }
みたいな感じ。しかし、破壊代入を使うと、もう少しメモリ効率の
良い方法があります。

変数で状態を表すってのは良くありますよね。そういう意味では必
須。なんだけど、メモリコストを払えば、実は不要。しかし、イン
タラクティブあるいはリアルタイムプログラムでは、状態は必須な
ので、破壊代入は必須。そんな関係ですね。

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