一回も披露したことのない豆知識

初学者です

int i = 10;
int j = i * 3;
System.out.print(j) ;
// 答え 30
はわかるのですが

int i = 10
i = i + 3
System.out.print(i) ;
// 答え 13 になります
// 普通の数学ではi = i + 3にならない
// 右辺の i を 左辺に移動すると、左辺が 0になり
// 0 = 3にならないので。
// そういう意味で わかりません
// 10 = 10 + 3  と 代入されると コンピューターが
// 困らないのでしょうか

A 回答 (2件)

非常に良い質問ですね。


私もかつてこのことで悩んだ経験があります。(言語はJAVAではありませんでしたが)
大切なことはJAVAの=と数学の=は全く意味が異なるということです。
数学の=は、左辺と右辺は等しいという意味です。
a=b はaとbが等しいという意味です。
JAVAの=は等しいという意味はまったくありません。
JAVAの=は、右辺の値を左辺に格納するという意味です。
a=bは、bの内容をaに格納するという意味です。
その為、a=bを実行した結果はaとbは同じ値になります。
int i = 10
i = i + 3
は、
i+3の結果をiに格納するという意味であり、10+3の結果をiに格納することになります。それ故iが13になるのです。
i=i+3は、コンピュータの内部では、
iと3を加算した結果を一時的な記憶域(レジスタと呼ばれています)に、格納し、その結果をさらにiに格納しています。
レジスタをRと記述すると
R=i+3
i=R
のような実行を内部では行っています。

ちなみに=の記号が紛らわしいから、このような誤解が起こるのであって、
JAVAで=の代わりに←を使っていれば、(もし=の代わりに←が代入の記号として採用されていれば)
a←b とか
i←i+3
とかになりイメージが明快になるかと思います。

くどいようですが、JAVAの=に両辺が等しいという意味はありません。
JAVAの=の意味は、右辺の結果を左辺に格納するという意味だけです。
    • good
    • 1

代入というのは「新しく値に変更する」ものです。



使える文字の関係で、 = を使っていますが、
i ← i + 3
という表記ができたら、こちらが採用されていたかもしれない、というものです。

また、左の i は「値を入れるために i という名前の変数そのもの」を表わすもので、
右の i は 「この時点での変数 i に納められている値」を表わすものです。
= の左右で 同じ i でも 役割りが違います。


また、「普通の数学」と混同しているようだと
int i = 10;
int j = i * 3;
も「理解」ではなく「誤解」かもしれません。

int i = 10;
int j = i * 3;
i = 20 ;
System.out.print(j) ;
これで表示される j の値は 30 でしょうか 60 でしょうか それ以外でしょうか?


また
int i = 10;
int j = 40 ;
j = i * 3;
System.out.print(j) ;

10 = 10+3 と同じ理屈なら、 これも 40 = 10 * 3 ですよね?
    • good
    • 0
この回答へのお礼

ありがとうございます

お礼日時:2018/01/15 00:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!