はじめに
インクリメントとデクリメントの挙動について、ちゃんと理解できていなかったので、備忘録として残しておく。
答えはいくつ?
みなさん、特に私のような初学者の方は下記のコードの実行結果がぱっと思い浮かびますか?
(私はダメでした…)
Sample.java
public class Sample {
public static void main(String args[]) {
int a = 10;
int result = a++ - a + a++ + a-- + --a - a++;
System.out.println(result);
}
}
そもそもこんなわかりづらいコードに遭遇することはないと思いますが、
インクリメントとデクリメントが他の演算子と組み合わせて使われていた場合の挙動は理解しておく必要があるかと思います。
インクリメント演算子「++」、デクリメント演算子「—」
変数に1加算したり、減算したりするための演算子。
前置インクリメントと後置インクリメント
インクリメント演算子には、前置と後置があります。
int a = 10;
a++ // a = 10 + 1と同じ
++a // a = 11 + 1と同じ
単体で使う分には何も問題ありません。
しかし、下記のように他の演算子と組み合わせて使用すると…
int a = 10;
int b = a++; //10
int c = ++a; //12
挙動が異なりました。
前置すると「aに1を加算してから代入」をし、後置すると「代入してからaに1を加算」しています。
これだけなんですけど、理解せずに使うと予期しない動作につながりますよね。
(Swiftでは、たしか紛らわしくて廃止されてたと思いますし、参考書にも他の演算子使わないほうが良いと記載されていた気がします。)
冒頭のコードの出力結果
ここまでの内容を踏まえて、冒頭の答え合わせ。
Sample.java
public class Sample {
public static void main(String args[]) {
int a = 10;
int result = a++ - a + a++ + a-- + --a - a++; //10 - 11 + 11 + 12 + 10 - 10
System.out.println(result); //22
}
}
さいごに
インクリメントの挙動について復習、まとめてみました。
誰かのお役に立てれば幸いです。
参考書籍