Java道|代入演算子と複合代入のしくみ

値を入れるだけじゃない。
代入演算子を使いこなすと、Javaの計算はもっと短く、もっと読みやすくなる。

Javaでプログラムを書いていると、計算した結果を変数に入れる場面が何度も出てきます。たとえば、合計点を保存する、残り回数を減らす、今の値に新しい値を足して更新する、といった処理です。

このような処理の中心になるのが、代入演算子です。

Javaでは = を使って、右側の値を左側の変数に入れます。ここで大切なのは、Javaの = は数学の「等しい」という意味ではないことです。Javaでは、右辺を計算して、その結果を左辺の変数に代入するという意味になります。

さらにJavaには、+= や -= のように、計算と代入をまとめて書ける複合代入演算子があります。この記事では、指定内容に沿って Sample6.java のみを使い、代入演算子と複合代入のしくみを、鬼滅の刃風の世界観にたとえながら整理します。

鬼滅の刃風にたとえると、変数は「剣士が持っている力の器」、代入は「その器に新しい力を入れること」です。複合代入は、「今ある力に追加の修行成果を加えて、同じ器に戻す動き」と考えるとイメージしやすいです。

代入演算子とは

代入演算子とは、変数に値を入れるための演算子です。

もっとも基本になるのが = です。

a = 10;

これは、a に 10 を代入するという意味です。

数学では = を「左と右が等しい」という意味で使いますが、Javaでは少し違います。Javaでは、右辺の値を左辺の変数に入れるという処理を表します。

たとえば、次のように書いた場合です。

a = b;

これは、b の値を a に代入するという意味です。
a と b が同じかどうかを調べているわけではありません。

書き方意味
a = 10;10 を a に代入する
a = b;b の値を a に代入する
a = a + 1;a に 1 を足した結果を、もう一度 a に代入する

特に、次の形は最初に見ると少し不思議に感じるかもしれません。

a = a + 1;

数学の感覚だと、a と a + 1 が等しいように見えてしまいます。
しかしJavaでは、右辺を先に計算します。

つまり、a の現在の値に 1 を足して、その結果をもう一度 a に入れるという意味です。

古い値をもとに新しい値を作り、その新しい値で更新します。

= は「等しい」ではなく「入れる」

代入演算子を理解するときに一番大切なのは、= の読み方です。

Javaでは、次のように読むと分かりやすいです。

Javaの式読み方
power = 10;power に 10 を入れる
total = score;total に score の値を入れる
total = total + score;total に score を足した結果を、total に入れ直す

たとえば、次のコードを考えます。

int power = 10;
power = power + 5;

最初に power には 10 が入っています。
次に、power + 5 が計算されます。

この時点では、

10 + 5

なので、結果は 15 です。

そして、その 15 が power に代入されます。
その結果、power の値は 15 に更新されます。

処理power の値
int power = 10;10
power = power + 5;15

このように、代入は「今の値を使って新しい値を作り、同じ変数に入れ直す」ことがあります。

複合代入演算子とは

Javaには、= だけでなく、演算と代入をまとめた書き方があります。
これを複合代入演算子といいます。

代表的なものは次のとおりです。

記号名前意味
+=加算代入足して代入する
-=減算代入引いて代入する
*=乗算代入掛けて代入する
/=除算代入割って代入する
%=剰余代入あまりを代入する
&=論理積代入ビット演算などで使う
|=論理和代入ビット演算などで使う
^=排他的論理和代入ビット演算などで使う
<<=左シフト代入ビットを左にずらして代入する
>>=右シフト代入ビットを右にずらして代入する
>>>=符号なし右シフト代入符号を考慮せず右にずらして代入する

最初の段階で特によく使うのは、次の5つです。

記号よく使う場面
+=合計を増やす
-=残り数を減らす
*=値を倍にする
/=値を割って調整する
%=あまりを求めて更新する

まずは、+=、-=、*=、/=、%= をしっかり押さえると安心です。

+= 演算子の意味

+= は、今の値に何かを足して、その結果を同じ変数に代入する演算子です。

a += b;

これは、次の書き方と同じ意味です。

a = a + b;

つまり、a += b は、a に b を足して、その結果を a に入れ直すという意味です。

複合代入通常の書き方意味
a += b;a = a + b;a に b を足して代入する
a -= b;a = a - b;a から b を引いて代入する
a *= b;a = a * b;a に b を掛けて代入する
a /= b;a = a / b;a を b で割って代入する
a %= b;a = a % b;a を b で割ったあまりを代入する

鬼滅の刃風にたとえると、+= は「今の鍛錬値に、追加の修行成果を足して、鍛錬値を更新する」ような動きです。

たとえば、trainingPower が 10 のとき、

trainingPower += 5;

と書くと、trainingPower は 15 になります。

これは次と同じ意味です。

trainingPower = trainingPower + 5;

図:+= は a = a + b と同じ意味

↓クリックすると拡大表示されます。

この図が示していること

この図では、a += b が a = a + b と同じ意味であることを示しています。

a の現在値が 10、b の値が 5 の場合、まず 10 + 5 を計算します。
その結果は 15 です。
そして、その 15 をもう一度 a に代入します。

ここから分かることは、+= は単に短く書いているだけではなく、同じ変数を更新するための便利な書き方だということです。

複合代入演算子のよさ

複合代入演算子のよさは、コードを短く、読みやすくできることです。

たとえば、合計を少しずつ増やす処理を考えます。

通常の代入で書くと、次のようになります。

total = total + 5;
total = total + 3;
total = total + 2;

これを複合代入演算子で書くと、次のようになります。

total += 5;
total += 3;
total += 2;

どちらも意味は同じです。
しかし、+= を使ったほうがすっきりしています。

通常の書き方複合代入の書き方
total = total + 5;total += 5;
total = total + 3;total += 3;
total = total + 2;total += 2;

複合代入演算子を使うと、同じ変数名を何度も書かずに済みます。
そのため、「この変数を更新している」という意図が読み取りやすくなります。

鬼滅の刃風にたとえると、毎回「今の鍛錬値に追加修行を足して、鍛錬値として記録し直す」と長く説明する代わりに、「鍛錬値に追加する」と短く言えるようなものです。

空白の入れ方に注意する

複合代入演算子を使うときは、記号の途中に空白を入れてはいけません。

次の書き方は誤りです。

a + = b;

これは、+= という1つの演算子として扱われません。

+ と = が分かれてしまっているため、正しい複合代入演算子になりません。

正しくは、次のように続けて書きます。

a += b;
書き方正しいか理由
a += b;正しい+= が1つの演算子になっている
a + = b;誤り+ と = が分かれてしまっている

複合代入演算子は、記号全体で1つの演算子です。
そのため、+=、-=、*=、/=、%= は途中で分けずに書きます。

複合代入を確認する

ここでは、3回分の修行点を入力し、その合計を求めるプログラムを見ていきます。
入力された点数を total に順番に加えていくところで、+= を使います。

ファイル名:Sample6.java

import java.io.*;

class Sample6
{
    public static void main(String[] args) throws IOException
    {
        System.out.println("3回分の修行点を入力してください。");

        BufferedReader br =
            new BufferedReader(new InputStreamReader(System.in));

        String str1 = br.readLine();
        String str2 = br.readLine();
        String str3 = br.readLine();

        int total = 0;

        // 入力した修行点を順番に合計へ加える
        total += Integer.parseInt(str1);
        total += Integer.parseInt(str2);
        total += Integer.parseInt(str3);

        System.out.println("3回分の合計修行点は " + total + " 点です。");
    }
}

実行結果

3回分の修行点を入力してください。
10
20
15
3回分の合計修行点は 45 点です。

このプログラムでは、最初に total を 0 にしています。

int total = 0;

そのあと、入力された3つの値を順番に total へ加えています。

total += Integer.parseInt(str1);
total += Integer.parseInt(str2);
total += Integer.parseInt(str3);

Integer.parseInt は、入力された文字列を整数に変換するために使っています。
br.readLine で受け取った入力は文字列なので、計算に使うには整数へ変換する必要があります。

たとえば、10、20、15 と入力した場合、total の値は次のように変化します。

処理total の値
最初の状態0
1つ目の修行点 10 を加える10
2つ目の修行点 20 を加える30
3つ目の修行点 15 を加える45

このように、+= を使うことで、合計を少しずつ増やしていく処理が自然に書けます。

図:Sample6.javaのtotalが更新される流れ

↓クリックすると拡大表示されます。

この図が示していること

この図では、Sample6.java の中で total がどのように更新されるかを示しています。

最初、total は 0 です。
そこへ 10 を加えると 10 になります。
次に 20 を加えると 30 になります。
最後に 15 を加えると 45 になります。

ここから分かることは、+= が「現在の値に新しい値を足して、同じ変数に戻す」処理だということです。

通常の代入で書くとどうなるか

Sample6.java の += を、通常の代入で書くと次のようになります。

total = total + Integer.parseInt(str1);
total = total + Integer.parseInt(str2);
total = total + Integer.parseInt(str3);

これは、次の複合代入と同じ意味です。

total += Integer.parseInt(str1);
total += Integer.parseInt(str2);
total += Integer.parseInt(str3);

比較すると、対応関係がよく分かります。

複合代入通常の代入
total += Integer.parseInt(str1);total = total + Integer.parseInt(str1);
total += Integer.parseInt(str2);total = total + Integer.parseInt(str2);
total += Integer.parseInt(str3);total = total + Integer.parseInt(str3);

どちらも同じ処理ですが、+= のほうが短く書けます。
また、total を更新していることがひと目で分かりやすくなります。

よく使う複合代入演算子を具体例で整理する

ここで、よく使う複合代入演算子を具体例で確認します。

書き方通常の書き方意味
a += 3;a = a + 3;a に 3 を足して代入する
a -= 2;a = a - 2;a から 2 を引いて代入する
a *= 4;a = a * 4;a に 4 を掛けて代入する
a /= 5;a = a / 5;a を 5 で割って代入する
a %= 3;a = a % 3;a を 3 で割ったあまりを代入する

たとえば、a の値が 10 の場合を考えます。

処理結果
a += 3;13
a -= 2;8
a *= 4;40
a /= 5;2
a %= 3;1

それぞれの処理は、次のように考えます。

a += 3;

これは、a に 3 を足して、a に戻します。

a -= 2;

これは、a から 2 を引いて、a に戻します。

a *= 4;

これは、a に 4 を掛けて、a に戻します。

a /= 5;

これは、a を 5 で割って、a に戻します。

a %= 3;

これは、a を 3 で割ったあまりを、a に戻します。

複合代入演算子が役立つ場面

複合代入演算子は、変数の値を更新し続ける処理でよく使います。

場面意味
合計を増やすtotal += price;total に price を加える
残り数を減らすstock -= 1;stock を 1 減らす
値を倍にするpower *= 2;power を 2 倍にする
値を分けるamount /= 4;amount を 4 で割る
あまりを保存するnumber %= 5;number を 5 で割ったあまりにする

鬼滅の刃風にたとえると、次のようになります。

Javaの処理鬼滅の刃風のイメージ
total += score;修行点を合計に加える
stock -= 1;持っている護符を1枚使う
power *= 2;呼吸の集中で力を2倍にする
stamina /= 2;体力を半分に調整する
count %= 3;3組に分けたときの余りを確認する

このように、複合代入演算子は「現在の値を変化させて更新する」場面でとても便利です。

代入演算子を理解するうえで大切なこと

代入演算子を学ぶときは、次のポイントを意識すると理解しやすくなります。

ポイント内容
= は等号ではない右辺の値を左辺に代入する
右辺を先に計算する計算結果を左辺の変数に入れる
+= は省略形a += b は a = a + b と同じ
同じ変数の更新に便利合計や残り数の管理でよく使う
記号の途中に空白を入れない+= は1つの演算子として続けて書く

特に大切なのは、Javaでは右辺が先に計算されるという点です。

total = total + score;

この式では、まず total + score を計算します。
その結果を total に代入します。

この考え方が分かると、

total += score;

の意味も自然に理解できます。

複合代入演算子はコードの意図を分かりやすくする

複合代入演算子は、単に短く書くためだけの記法ではありません。
コードの意図を分かりやすくする効果もあります。

たとえば、次のコードを見てみます。

total += score;

このコードを見ると、total に score を加えて更新していることがすぐに分かります。

一方で、次のようにも書けます。

total = total + score;

こちらも正しい書き方です。
ただし、total が2回出てくるため、少し長く見えます。

書き方印象
total = total + score;処理の流れが丁寧に見える
total += score;更新している意図が短く伝わる

Javaのコードは、動くだけでなく、あとから読んで分かりやすいことも大切です。
複合代入演算子を使うと、変数を更新していることが簡潔に伝わります。

初心者がつまずきやすいところ

代入演算子と複合代入演算子では、次の点でつまずきやすいです。

つまずきやすい点考え方
= を等号だと思ってしまうJavaでは右辺を左辺に入れる
a = a + 1 が不思議に見える右辺を先に計算して、a に戻す
+= が特別な計算に見えるa += b は a = a + b の短い書き方
a + = b と書いてしまう+= は途中で分けずに書く
いつ使えばよいか迷う同じ変数を更新するときに使う

特に、次の2つを区別できるようになると理解が進みます。

a = b;

これは、b の値を a に入れる処理です。

a += b;

これは、a に b を足して、a に入れ直す処理です。

似ていますが、a += b では、もともとの a の値も計算に使われます。

Sample6.javaの処理を一歩ずつ読む

Sample6.java では、まず次のように入力の準備をしています。

BufferedReader br =
    new BufferedReader(new InputStreamReader(System.in));

これは、キーボードから入力を受け取るための準備です。

次に、3回分の入力を受け取っています。

String str1 = br.readLine();
String str2 = br.readLine();
String str3 = br.readLine();

ここで受け取った str1、str2、str3 は文字列です。
そのため、数値として足し算するには、Integer.parseInt で整数に変換します。

total += Integer.parseInt(str1);

この1行では、次の処理をしています。

処理内容
Integer.parseInt(str1)str1 を整数に変換する
total += 変換した値total にその値を足して更新する

たとえば str1 が 10 なら、次と同じ意味になります。

total = total + 10;

このように、入力された値を順番に total に加えていくことで、合計点を作っています。

学習で意識したい読み方

複合代入演算子を見たときは、頭の中で次のように読み替えると分かりやすいです。

見たコード頭の中での読み替え
total += score;total = total + score;
stock -= 1;stock = stock - 1;
power *= 2;power = power * 2;
amount /= 4;amount = amount / 4;
number %= 5;number = number % 5;

最初のうちは、複合代入演算子を見たら、通常の書き方に戻して考えるのがおすすめです。

total += score;

を見たら、

total = total + score;

と読み替えます。

慣れてくると、total += score を見ただけで、「total に score を足して更新する」と自然に読めるようになります。

Javaらしい読みやすい書き方へ

代入演算子と複合代入演算子は、Javaの基本ですが、とても重要です。

特に、合計を求める処理や、値を少しずつ更新する処理では、複合代入演算子を使うとコードがすっきりします。

total += Integer.parseInt(str1);
total += Integer.parseInt(str2);
total += Integer.parseInt(str3);

このように書くと、total に値を順番に加えていることが分かりやすくなります。

鬼滅の刃風にたとえると、total は剣士の総合修行点です。
1回目、2回目、3回目の修行成果を順番に加えていき、最後に総合修行点として表示します。

複合代入演算子は、こうした「今ある値を育てていく処理」と相性がよい書き方です。
= の意味、右辺を先に計算する流れ、そして += が a = a + b の短い書き方であることを押さえておくと、Javaの計算処理がぐっと読みやすくなります。