みなさまこんにちは。
Numata です。
今回はJavaでよく見る++(インクメント)– –(デクリメント)の
計算処理について解説します。
初心者の方々は、おそらくfor文で初めて見たであろう”++”←コイツ
インクリメントと呼ぶのですが、コイツを単に1をプラスするヤツという
覚え方をしてしまうと、後々壁に当たります。
1 2 3 4 5 6 7 8 9 10 |
public class Sample { public static void main(String[] args) { int a = 1; int b = 5; System.out.println(a + b + ++a + b++); } } |
この例題の答えが”14”になると思ったそこのあなたは必見です。
実は、この計算式の答えは”13”なのです。
もくじ
前置・後置によって計算順序が変わります
まず、インクリメント・デクリメント演算子はどのような働きをするかを整理しましょう。
①インクリメント・デクリメントは、変数にくっついています。
②くっついている変数が保持している値をプラス1して変数に代入します。
②が重要です。ただ変数が保持している値をプラス1するだけでなく、
プラス1した値を再代入してくれるのです。
計算式で書くとこのようなことをやってくれているのです。
1 2 3 4 5 6 7 8 9 |
int a = 5; //aに1を足したい //普通の計算式 a = a + 1; //インクリメント(2通り) a++; ++a; //初心者がやりがちなミス(代入していない) a + 1; |
※初心者は、代入することを忘れることがしょっちゅうあります。(私もそうでした。)
注意しましょう。
インクリメントは式を見やすく簡潔にしてくれる優れモノです。
しかし、ただ1を追加してくれるだけの演算子というだけの理解は危険です。
上記例プログラムのように、++は前にも(前置)後ろにも(後置)つけられます。
しかし、前置と後置では、計算結果が変わることがあります。
例えば、
1 2 |
a + b + ++a + b++ a + b + ++a + ++b |
この二つの式では、計算結果が変わります。
最後のbに注目すると、
上の式では後置(b++)、下の式では前置(++b)
していることがわかります。
下記2点に注意しましょう!
・インクリメント/デクリメント演算子は変数の前後どちらにもつけられる
・前置と後置で、計算処理が行われるタイミングが違う
Javaでは演算子に計算順序が設定されています
Javaでは様々な演算子が登場します。(+ – / % && || など)
そしてそれぞれの演算子には、計算順位がつけられています。
計算順位とは、一つの式の中で、複数の演算子が出てきたとき、
どの演算子から計算するかを順位付けしたモノです。
小学校の時に習った、+と÷なら、÷から計算する。というルールと同じです。
この計算順位に基づいて、Javaの計算式は計算されます。
よく使うJavaの計算順位をまとめました。
優先順位 | 演算子 |
高い | [] ++ – |
+ ! | |
new() | |
* / % | |
+ - | |
< > <= >= | |
== != | |
& | |
| | |
&& | |
|| | |
低い | = += -=etc.(算術演算子=) |
(ご覧の通り、インクリメント・デクリメントは計算順位がめちゃくちゃ高いです。)
計算順位に沿った計算方法をすると、予想とずれた違う計算が行われることがあります。
Javaは必ず計算順位に沿って計算をします。
もうこれは決まりなので、Javaがどのような計算をするのかを
こちらで理解してあげることが手っ取り早く計算式を書ける秘訣です。
それでは具体的な計算方法を見ていきましょう。
計算方法
左から順に読んでいって、出会ったらすぐに実行する。
これがインクリメント式の攻略法です。
以下例プログラムです。
1 2 3 4 5 |
int a = 5; int b = 1; //計算式の結果を出力 System.out.println(a + ++a + b++ + ++b + a++); |
この式を左から順に読んでみましょう。
まずaは5なので
1 2 |
5 + ++a + b++ + ++b + a++ (a=5,b=1) |
になります。
次に+、そのあとに++aが来ます。++aは6になるので
1 2 |
[5 + 6]→ 11 + b++ + ++b + a++ (a=6,b=1) |
になります。
次に+、そのあとにb++が来ます。++は後ろについているので、+のほうが先に計算されます。
1 2 |
[11 + 1(bは足し算の後インクリメントされ、2になる)]→12 + ++b + a++ (a=6,b=2) |
ここで特殊な計算が行われています。
bは1の状態のまま計算され、その後+1されます。
その理由は演算子の計算順位と式の処理の性質にあります。
大前提として、計算式は左から右に実行されます。
その中で、計算順位が高い演算子があればその演算子を先に計算します。
インクリメントはなぜ計算順位が高いのに、先に計算されないの?
と思った方は勘が良いですね。
インクリメントは算術演算子とは違う特殊な演算子です。
ルールとしてそういうものなんだ で覚えましょう。
私も疑問に思って深堀したのですが、結局答えが見つかりませんでした。。
計算式に戻りましょう。
次に+、その次に++bが来ます。bは現在2になっているため++bは3になるので、
1 2 |
[12 + 3]→15 + a++ (a=6,b=3) |
になります。
次に+、その次にa++が来ます。インクリメントは後ろについているため、計算結果は
1 2 |
[15 + 6(aは足し算の後インクリメントされ、7になる)]→21 (a=7,b=3) |
となります。
前置インクリメント:計算の前に変数の値が変化
後置インクリメント:計算の後に変数の値が変化
という仕組みになっていることがわかります!
デクリメントも計算順位は全く同じです。
計算順位に注意しましょう!
計算順序に注意して計算しましょう
注意点は、後置の時です。
計算は今変数に入っている値を使って行う。
→計算が終わったら変数に入っている値を変える。
この順序を崩すことなく計算すれば、どんな長い式でも確実に計算できます。
インクリメントの知識はOCJPSiverという、Javaの資格試験でも必要な知識になります。
きっちり覚えて、今後の学習につなげましょう!
1 2 3 |
<a href="https://px.a8.net/svt/ejp?a8mat=3BK5JW+BUVTIQ+3JTE+5ZMCH" rel="nofollow"> <img border="0" width="234" height="60" alt="" src="https://www26.a8.net/svt/bgt?aid=200814620717&wid=001&eno=01&mid=s00000016565001006000&mc=1"></a> <img border="0" width="1" height="1" src="https://www14.a8.net/0.gif?a8mat=3BK5JW+BUVTIQ+3JTE+5ZMCH" alt=""> |
コメント