いろいろな演算子

インクリメント・デクリメント演算子

プログラムを作るとき、変数aの値を1だけ増やしたいときがよくあります。これは次のように書けば実現できます。

a = a+1;

これは数学では決して成り立たない式ですが、Javaでは正しい式です。すでに述べたように、Javaでは=は右辺を左辺に代入するという意味になります。ですから、aと1の和をもう一度aに入れ直すということになるわけです。

しかし、次のような、より簡潔な書き方もあります。

a++;

これだけで、aの値は1だけ増えることになります。値を1だけ増やすことをインクリメントといい、++のことをインクリメント演算子といいます。

逆に1だけ減らしたいときは、

a = a-1;

または、

a--;

と書けばよいのです。値を1だけ減らすことはデクリメントといい、--のことをデクリメント演算子といいます。

インクリメント演算子は、

a++;

と書いても、

++a;

と書いても同じ結果になりますが、代入等の処理を伴うと、結果が違ってくる場合があるので注意が必要です。

OperatorSample03.java
class OperatorSample03 {
    public static void main(String[] args){
        int a = 9;
        int b;
        
        b = a++;
        
        System.out.println("a = " + a);
        System.out.println("b = " + b);
    }
}
OperatorSample03の実行結果
a = 10
b = 9

なぜこのような結果になるのかを説明しましょう。

b = a++;

というコードは、

b = a;
a++;

と等価なのです。つまり代入してからインクリメントしていることになるのです。

ここで、OperatorSample03を少しだけ書き換えてみましょう。

OperatorSample03A.java
class OperatorSample03A {
    public static void main(String[] args){
        int a = 9;
        int b;
        
        b = ++a;
        
        System.out.println("a = " + a);
        System.out.println("b = " + b);
    }
}

OperatorSample03AはOperatorSample03の

        b = a++;

の部分を

        b = ++a;

と書き換えただけのものです。ではコンパイル、実行してみましょう。

OperatorSample03Aの実行結果
a = 10
b = 10

結果がちょっと違ってきました。それは、

b = ++a;

というコードが、

++a;
b = a;

と等価だからです。つまり今度はインクリメントしてから代入していることになるのです。

いずれにせよ、

b = a++;

のような書き方は、思わぬ勘違いの原因になりそうなので、代入とインクリメントにはっきり分けて書いた方がいいでしょう。

もちろん、以上述べたことはデクリメントに関してもいえます。

複合代入演算子

それでは、変数aの値を2だけ増やしたい場合や、2倍したい場合も、インクリメントのような簡単な書き方があるのでしょうか。そんなふうに考えると、なんだかいろんなケースが出てきそうですね。これらをまとめて解決するのが、複合代入演算子というものです。その一覧表を見てください。

表 5-2 : 複合代入演算子
演算子 名前 使用例 書き換え
+= 加算代入 a += b a = a + b
-= 減算代入 a -= b a = a - b
*= 乗算代入 a *= B a = a * b
/= 除算代入 a /= b a = a / b
%= 剰余代入 a %= b a = a % b

この表を見ていただければ、だいたいお分かりでしょう。

例えば、numberという変数の値を2だけ増やしたい場合は、

number = number + 2;

と書いてもいいのですが、

number += 2;

と書くこともできるのです。

また、numberという変数の値を2倍したい場合は、

number = number * 2;

と書いてもいいのですが、

number *= 2;

と書くこともできるのです。

これは特に変数名が長い場合は楽に入力できるし、読みやすくなるので便利です。

では、次の式を計算するプログラムを作ってみましょう。

( ( 5 + 1 ) * 4 - 8 ) / 2

いっぺんに計算することもできるのですが、今回は複合代入演算子の使用例を示すために、一つずつ計算して、途中経過も表示させてみます。

OperatorSample04.java
class OperatorSample04 {
    public static void main(String[] args){
        int number = 5;
        
        number += 1;
        System.out.println("答えは " + number);
        number *= 4;
        System.out.println("答えは " + number);
        number -= 8;
        System.out.println("答えは " + number);
        number /= 2;
        System.out.println("答えは " + number);
    }
}

いかがでしょうか。複合代入演算子を使っているので、すっきりと書けていると思います。

number = number+1;

のような書き方をした場合を想像して比べてみてください。

実行結果は次のようになります。

OperatorSample04の実行結果
答えは 6
答えは 24
答えは 16
答えは 8

複合代入演算子を使うと、すっきりした式が書ける。