プログラミング初心者の私が理解できた範囲のことをできるだけかみ砕いて、これからプログラミングを始める方にも分かりやすいようにまとめています。
記事内では「です」「ます」調を使っていないのですが、最初は理解できたことなどをそのまま思うままに書いていくつもりなので許してください。
では続きをどうぞ。
はじめに
今回は演算子の一つ、代入演算子について。
演算子の種類は主に以下のものが挙げられる。
- 算術演算子…四則演算や余りの計算で使うもの(「+」や「-」など)
- 比較演算子…ある数より大きいか小さいかを表すもの(「==」や「>」、「<」など)
- 代入演算子…ある文字や数を代入するときに使うもの(「=」や「+-」、「-=」など)
- 論理演算子…「~ではない」、「~と~」などをあらわすもの(「!」や「&&」など)
- インクリメント演算子…ある数に1を加えるということを表すもの(「++」)
- デクリメント演算子…ある数から1を減らすということを表すもの(「–」)
前回は比較演算子について書いた。
今回は「代入演算子」とは何ぞやについてみていく。
代入演算子の種類
代入演算子とはその名の通り、ある数字AをBに代入することを示すもの。
これから基本的なもの6つについて見ていく(初心者ゆえに…)。
共通している点としては、代入演算子には「=」がつくということがポイント。
では始め。
= 代入を表す演算子
これまでも出てきてた「=」。
これは「等しい」を表すものではなく、実は「代入」を表すものだったのだ。
これについて、以前にちょっと以下の記事で触れた。
vol.6 数字の演算-引き算編~計算式を入力する時の注意点の[注意点]参照
今まででてきた形式で例に挙げる。
例) int x=5;
int y=10;
int A=x+y; ※System.out.println()は省いている。
以上に挙げた形の式は四則演算の足し算のもの。
「=」の使い方については引き算や掛け算も足し算と同様である。
この「=」の役割は代入であり、「等しい」ではない。
どういうことかというと、「int x=5;」というのは「x=5」ということではないのである。
混乱した?
この式の見方としては『「5」という数字が「x」に代入されている』ということ。
xと5は同じものではなく、5という数字がxに代入されているから「xの値は5」ということになるのである。
この「=」という記号は矢印のようなもので、「int x←5」というようなイメージ(代入を表す)。
ここで分かるのは、計算されるのはまずイコールの右側ということか(int A=x+y;ならx+yが先に計算される)。
より分かりやすい例がこちら。
int A=15;
A = A+5; ※System.out.println()は省いている。
この式はエラーじゃないんだなこれが。
数学では間違っているように見えるこの式だが、プログラミングではこの記述が可能。
なぜかというと、「=」は等しいという意味ではなく「代入」を表すから。
プログラミングでは自分が持っている数字(この場合はAが15を持っている)にさらに数字を計算して新たな数字を出すことが可能なのである。
int A=15は15がAに入っているということ。
A = A+5は「A+5の結果(値)がAに代入されている」ということなのである。
よって、最初に定義されたint Aは「15」。
その「15」と「+5」を計算した「20」が「A」の新しい値となるのである。
A = A+5は数学的に計算したら「15=15+5」だからおかしいとなる。
それもそのはず。数学の「=」は「等しい」を表すから。
でもJavaプログラミングでは「代入」だから「 A←15+5」ということになる。
このとき、int A=A+5とするとエラーが出る。
なぜなら、Aは「int A=15」としたときにそこでintをすでに使用しているから。
引き算の所でも見たように、
int x=5;
int y=10;
int A=x+y;
int A=x-y; ※System.out.println()は省いている。
というのは、足し算と引き算がそれぞれ違う計算方法で違う数字を「A」に代入しようとしているからエラーが出る。
そもそも変数(ここではAやx、yが変数)には文字や数字は一種類しか入れられないのである。
最初に出てくる「int A=x+y;」は「x+y(足し算)」の計算結果を「A」に入れると指示している。
その結果を無視して、新たに「int A」に「x-y(引き算)」の結果を代入しろとは指示できないのである。
⇒もうすでにint Aには「x+y」が代入されているから、もう一個入れるということは不可能。
そのため、新しい結果(int x=5;、int y=10;を使った計算)を求めたい場合は新たに変数を用意する必要があるのである(int B=x-y;など)。
int Aの結果を次の式で使いたいときはAを使うことができる。
例)int x=5;
int y=10;
int A=x+y;
A = A-y;
A=A+x; ※System.out.println()は省いている。
例えばこんな式。
int Aの結果はx+yの結果を代入するから「15」。
次の行の「A=A-y;」は、まず右辺の「A-y」に注目。
「=」はこの式を左に代入するということだから、計算されるのはまず右側。
「A-y」のAは「15」、yは「10」だから「15-10」ということになる。
この計算により、「A」には新たに「5」という数値が入った。
そしてご存じのようにプログラムは上から処理されていく。
「A=A-y;」で得た計算結果「5」(左のAの新しい結果)は次の行に引き継がれていくのである。
A=A+x;
まずは右を計算。
上の行で得た新たなAの値は「5」だから、その値が「int B=A+x;」に引き継がれる。
よってこの計算は「A=5+5」ということ(A=10)。
ポイントとなるのは最初に定義したint Aの数字(ここでは15)が引き継がれるのではないのである。
int Aはあくまでも最初に定義(宣言)した数字というものであって、「A=A-y;」などと計算式にAをいれてどんどん計算していけばAの値はどんどん変わる。
A=A+x;のように、Aがすでに持っている数字(5)に任意の値(5)を足して、その値をA自身に再び代入して新たな結果(A=10)を得るというのはプログラムの計算ではよくつかわれるみたい。
結構重要ポイント
注意ポイント
※パッケージやクラスコードなどは省略
int x=5;
int y=10;
int A=x+y;
A = x-y;
A = x*y;
System.out.println(“結果=” +A);
この場合、画面で表示されるのは「結果=50」だけだった。
特にエラーも起きなかったが、表示されたのは最後の行に書いた「A = x*y;」の部分の結果だけだった。
何が原因なんだろう?
A=A+5とかの形にして次の行の式の右側にAを入れないとダメみたいだけど…。
int x=5;
int y=10;
int A=x+y;
A = x-y;
int B = A*y;
System.out.println(“結果=” +A);
System.out.println(“結果=” +B);
上の式の時はせっかく「int A=x+y;」としているけどその計算が無視されて、「A=x-y;」から計算されている。
次の行の式を見ると「int B =A*y」とあり、右側に「A」が含まれているから計算結果が引き継がれたみたい。
これで分かったのは、プログラムは左から始まり「=(イコール)」を挟んでジグザグに代入されていき、途切れているものは飛ばされる(内部で計算はされているけど次の式には影響しない?)ということかな。
int x=5;
int y=10;
int A=x+y;(int Aは15だが、次の式の右側にAを入れることができないから、この式は計算されてはいるけど次の式には影響を与えない?)
A = x-y;(xとyの値を入れたAの値が出る。このAの値が次の式に引き継がれている。)
int B = A*y;(上で出たAの結果が右のAに代入され、int Bの結果を計算している。)
※int Bは新しい結果になるから新しい変数を作っただけのもの。この場合、「int」は必要。
結果を次の式に引き継ぎたければint Bを使わずに「A=A*y;」としてもよい。
なげー
要は「=」は代入をする演算子。
「あくまでも代入だから数学とは違う計算式が作れるよ」ということ(短い)。
ここをおさえたら後はだいぶ簡単。
+= 加法代入の演算子
実はこれについては上で既にみている。
というのも、この「+=」は省略形。
A += 5;
こう書かれてあったら、これは「A = A+5;」の省略形なのである。
A+=5だから「=」の右側に「A」がない!
代入できない!
とちょっと思うかもしれないが、「+=」は短縮形だから実際には「A=A+5」。
int x=5;
int y=10;
int A=x+y;
A=A+x;
上の式は次のように書き換えることができる。
int x=5;
int y=10;
int A=x+y;
A += x;
書き方が違うだけで全く同じ式。
コードの書き方は複数あり、正常にプログラムが実行されれば問題ないと思う。
ちなみにここの計算結果は「20」。
コードを書くときは自分の書きやすい方でいいと思うけど、こういう書き方があることは知っておく必要があるのか…めんd()ゴホッ
-= 減算代入の演算子
これは加法代入の逆でマイナスになる。
というのも、この「-=」も省略形。
A -= 5;
こう書かれてあったら、これは「A = A-5;」の省略形なのである。
int x=5;
int y=10;
int A=x+y;
A=A-x;
上の式は次のように書き換えることができる。
int x=5;
int y=10;
int A=x+y;
A -= x;
減算代入も考え方は同じ。
int Aの値を次の式の右のAに代入して、新たなAの値を求めたもの。
A-=x ⇒ A=A-5 ⇒ A=15-5 ⇒ A=10
ここの最終的なAの値は「10」。
*= 乗算代入の演算子
同じく短縮形。
掛け算である。
int x=5;
int y=10;
int A=x+y;
A=A*x;
上の式は次のように書き換えることができる。
int x=5;
int y=10;
int A=x+y;
A *= x;
掛け算ということだけで考え方は全く同じ。
A*=x ⇒ A=A*5 ⇒ A=15*5 ⇒ A=75
最終的なAの値は「75」。
/= 除算代入の演算子
こちらも同様に短縮形。
割り算のことである。
double x=5;
double y=10;
double A=x+y;
A=A/x;
上の式は次のように書き換えることができる。
double x=5;
double y=10;
double A=x+y;
A /= x;
割り算の式として考える。
A/=x ⇒ A=A/5 ⇒ A=15/5(15割る5) ⇒ A=3
doubleと変数の型を指定しているから小数点を含んだ数字となる。
なぜ「double」を使うかは以下参照。
Javaプログラミング初心者の記録vol.8 数字の演算-割り算編
よって最終的なAの値は「3.0」。
%= 剰余代入の演算子
余りの計算も同様の形で計算できる。
%=も短縮形。
int x=5;
int y=10;
int A=x+y;
A=A%x;
上の式は次のように書き換えることができる。
int x=5;
int y=10;
int A=x+y;
A %= x;
A%=x ⇒ A=A%5 ⇒ A=15%5(15割る5の余り→0) ⇒ A=0
余りが出ない場合は「0」になるから、ここでのAの最終的な値は「0」。
まとめ
以上のものが「代入演算子」。
「=」がどのような役割かを理解できて、さらに加法代入の演算子が理解できれば大丈夫。
あとは四則演算と余りの計算で使った演算子(算術演算子「+、-、*、/、%」)を使っているだけ。
一つが理解出来たら後はそれぞれの計算方法で計算すればOK。
ちょっと難しかったら、まずは加法代入(足し算)から完璧に理解していったら他のも理解できると思った。
数学Ⅱまでしか勉強したことないけど、A=A+5なんて見たことないから最初は混乱したけど、すでにある数字にさらに数字を足して新しい値を得ることができるってちょっと面白いと思った。
コメント