[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 1571] Re: ポインタの定義



やました です。

> > 命令型の言語の「変数」には左辺値と右辺値があって、これの
> > とりあつかいがそれぞれの言語で異なるのを明解に分類し、
> > 説明したものがなかったというのがこれまでの状況なんでしょうか。
> 
> 「変数」には左辺値と右辺値がありますね。それは、本当に
> ポインタがないFORTRANなどでも同じです。

はい。

>   hoge = 5; // このhogeは左辺値
>   piyo = hoge; // このhogeは右辺値
> 
> というわけで、
> 
> > (0) 代入(assignment)命令がある
> 
> これはともかく、
> 
> > (1) 右辺の側で「変数」から左辺値をとりだす演算と
> >     左辺値から右辺値をとりだす演算がある
> 
> ここの「左辺値」とは、変数を左辺値として扱うための値であるところの
> 「ポインタ」のことですね?

いえ、左辺値を右辺値としてあつかうための「ポインタ」のことです。

> でも、ポインタも、いったん取り出すと単なる右辺値であって、

# おっと、私は、おなじことをいっているつもりです。

> それを格納する「変数」には左辺値が存在します。そして、
> Javaでは、その「変数」へのポインタをとりだすことができない
> わけです。
>
> が、Cでも、malloc()によりヒープへのポインタを得ることができるので、
> Cのポインタは変数を指すものばかりではないわけです。
> また、Javaでもnewしたオブジェクトへの参照を得ることが出来ます。
>
> > 「Java にはポインタがない」 〓 「Java では(1)は偽」
> 
> というわけで、「ポインタ」を「変数へのポインタ」に限定すれば
> (1)は偽ですが、「ポインタ」を「変数へのポインタ」に限定した
> 論調は見たことがありません。

「ポインタ 〓 右辺値化された(or 右辺値としてあつかえる or 第1級の)左辺値」
のようなニュアンスで、書いています。ので、「変数へのポインタ」に限定した
つもりではないです。

というか、変数は値を「表示する名前」という意味でつかっているつもり
です。なので、「命令型の言語の「変数」には左辺値と右辺値があって」
と私が表現しているのは舌たらず(むしろ間違い)で、

「命令型の言語の「変数」は左辺値と右辺値の2種類値を表示していて」

と言い直させてください。

> > (2) 関数の呼出しの際、実引数と仮引数の結合が、左辺値でおこなわれる
> >
> > 「Java にはポインタがある」 〓 「Java では(2)は真」
> 
> これはさっぱりわかりませんが...
> 
> Javaの引数ってのは、モロに右辺値を渡してますよね(call by value)?

えっと、オブジェクトをディープコピーしたりしませんよね。

> 「参照orポインタ」のことを「左辺値」と呼ぶのなら、オブジェクトを
> 渡す場合に限り確かに参照渡しですが、呼び出され側でその参照は
> 別の変数に格納され、

渡ってきた左辺値を表示する新しい名前(変数)ができるだけですよね。

> あまつさえ書き換えもできてしまうのだから、

(私には)「実引数と仮引数の結合が、左辺値でおこなわれる」ように見える
のですが。。。

前橋さんと私とでは、起っている現象の(理解の)イメージは同じだけれど、
表現が違っているので齟齬を感じるのかなあ。それとも、そもそも
理解のイメージが違うのかしらん。

--
Nobuo Yamashita
mailto:nobsun@xxxxxxxxxxxxxxxxxx
http://www.sampou.org/nobsun/