ヒネた学生の課題例

コンピュータアルゴリズムで出た課題。

ちょっと変な課題を出してみたいと思う。教科書59頁のリスト3-10(Array4.java)に対して,プログラミングを始めたばかりの高校生が以下のような質問をしてきた。君なら何と答える?自分の言葉で説明するように!
「Array4.java において配列 a, b を定義して,a は {1, 2, 3} で初期化しているから,各々の要素に対する実体(メモリ)が確保されて,そこに 1, 2, 3 が代入されています。その後 b=a; と a を b に「代入」しています。この場合,b 用に実体(メモリ)が確保されて,b の実体に対して,b[0]=a[0], b[1]=a[1] というように各々の値がコピーされるのでは「なく」,b=a; というのは,b を a の「別名,あだ名」として初期化している,,,,と説明されました。でも,a, b が普通の int 型なら,b=a; は,a の内容を b にコピーする,という意味なんだから,a, b が配列の時だって,b=a; というのは,a の内容が b にコピーされる,と解釈するのが自然だと思います。配列の時だって,a の内容が b にコピーされる,というように考えちゃいけないんですか?あだ名とか,別名とか,何か変!そもそも,b=a; という見た目が同一の表現にどうして複数の解釈を要求するのか,それがよく分かりません!変なの!」

これへの自分の回答がこれ。

>配列の時だって,a の内容が b にコピーされる,というように考えちゃいけないんですか?
Java言語の場合に限定して言うと、かんがえちゃいけません。Javaの実装として配列は参照型として扱われます。
仕様は仕様です。以上。

で終わらせるのもなんなのでもう少し蛇足。
Javaの場合、おそらく配列の確保にはオーバーヘッドがかかるという観点からだと思われますが新しい配列が宣言されたときにはメモリの「番地」をあらわす変数分のメモリだけか確保されます。
>b を a の「別名,あだ名」として初期化している,,,,と説明されました。
という部分を正確に説明すれば、b という「番地」をあらわす変数(=参照型)が宣言されて、b = a という代入の部分では b に a の「番地」が代入されているということになります。

>b=a; という見た目が同一の表現にどうして複数の解釈を要求するのか,それがよく分かりません!変なの!
確かにヘンです。がC言語以来の伝統なのでそんなものだと思ってあきらめてください。

次の課題

教科書76頁において,加算演算子('+')が多種多様な機能を持つことを学んだ。「文字列 '+' 数値」なんてのは,ピントこなかった人もいると思う。授業でこれまで扱った型(基本型と文字列)を使って,色んなものを「足してみて」Javaが定義する '+' の多様性を確認せよ。数値と言っても,float やら double やらあるでしょう。また,'+' 記号にここまで多様な機能を持たせる,というのは,作ったプログラムが「思いも寄らぬ動作」をする('+' 記号が,思った以上のことをしてしまうが為に,こちらの意図通りに動作してくれない)可能性がでてくると思われるが,この点についてどの思うか?素直な感想を述べよ(君がプログラミング言語を設計する場合,どういう戦略を立てるのか,というのを考えてみよ)。

の回答がこれ。

仕様として中途半端だと思う。C++のように演算子オーバーロードをさせてくれるか、 さもなければいっそ型チェックでエラーにしてくれる方がマシ。

一行で書いちゃた。教官の心証は相当悪いだろうなー。