代入・単項演算子

目次
  • 解説
  • 1. 代入演算子
  • 2. 単項演算子
問題に挑戦!
進捗を変更する




解説

1. 代入演算子


代入演算子には「変数 > 代入と値」のページで解説した、ただ代入するだけのイコール「=」以外にも、変数に入っている値を使用した計算結果を再代入する複合代入演算子が存在します。

代入演算子用例処理内容
=A = BAにBを代入する
+=A += B「A = A + B」と同じ
AにBを足し算(String型ならばAとBを結合)し、
結果をAに再代入する
-=A -= B「A = A - B」と同じ
AからBを引き算し、結果をAに再代入する
*=A *= B「A = A * B」と同じ
AとBを掛け算し、結果をAに再代入する
/=A /= B「A = A / B」と同じ
AからBを割り算し、結果をAに再代入する
%=A %= B「A = A % B」と同じ
AからBを割り算し、余りをAに再代入する

なお、右辺が式だった場合にはその計算が優先されます。実際に代入される値を確認しておきましょう。

    static void practiceCompound() {
        int intVariable = 1;
        Logger.out(intVariable);
        intVariable += 100;      // intVariable = intVariable + 100
        Logger.out(intVariable);
        intVariable -= 50;       // intVariable = intVariable - 50
        Logger.out(intVariable);
        intVariable *= 4;        // intVariable = intVariable * 4
        Logger.out(intVariable);
        intVariable /= 6;        // intVariable = intVariable / 6
        Logger.out(intVariable);
        intVariable %= 8;        // intVariable = intVariable % 8
        Logger.out(intVariable);

        intVariable *= 1 + 2 + 3; // intVariable = intVariable * (1 + 2 + 3)
        Logger.out(intVariable);
    }
[2020/12/31 12:34:56.789] 1    // 宣言時に代入された「1」
[2020/12/31 12:34:56.789] 101  // 「1」に「100」を加算
[2020/12/31 12:34:56.789] 51   // 「101」から「50」を減算
[2020/12/31 12:34:56.789] 204  // 「51」に「4」を乗算
[2020/12/31 12:34:56.789] 34   // 「204」から「6」を除算
[2020/12/31 12:34:56.789] 2    // 「34」から「8」を除算したあまり
[2020/12/31 12:34:56.789] 12   // 先に「(1 + 2 + 3)」を計算して「2」に乗算

2. 単項演算子


単項演算子とは、変数の前後に「++」や「--」を付けることで、その変数の値を直接加算・減算できる演算子です。他の演算子と異なり、演算に使用されるオペランド)が単体(=変数が単体)で成り立つ「」となるため「単項演算子」と呼ばれます。

短い表記で加算・減算ができるため便利ですが、前に付けた場合と後に付けた場合で、それぞれ処理内容が異なり、式を参照した場合の結果をよく理解した上で使う必要があります。

前に置く場合

前置単項演算子用例呼び方・処理内容
++B = ++A前置加算演算子・インクリメント
変数Aに対する影響 A = A + 1 と同じ
変数Bに対する影響 加算後のAが代入される
--B = --A前置減算演算子・デクリメント
変数Aに対する影響 A = A - 1 と同じ
変数Bに対する影響 減算後のAが代入される

後に置く場合

後置単項演算子用例呼び方・処理内容
++B = A++後置加算演算子・インクリメント
変数Aに対する影響 A = A + 1 と同じ
変数Bに対する影響 加算前のAが代入される
--B = A--後置減算演算子・デクリメント
変数Aに対する影響 A = A - 1 と同じ
変数Bに対する影響 減算前のAが代入される

前に置いた場合と後に置いた場合の違いを確認しておきましょう。

    static void practiceUnary() {
        int counter = 0;
        Logger.out(counter);   // (1)
        ++counter;             // 前置加算演算子
        Logger.out(counter);   // (2) 前行で加算済みの値
        counter++;             // 後置加算演算子
        Logger.out(counter);   // (3) 前行で加算済みの値

        int output = 0;
        output = ++counter;    // outputに代入される値は加算後
        Logger.out(output);    // (4) 代入された加算後の値
        Logger.out(counter);   // (5) 前々行で加算済みの値
        output = counter++;    // outputに代入される値は加算前
        Logger.out(output);    // (6) 代入された加算前の値
        Logger.out(counter);   // (7) 前々行で加算済みの値

        Logger.out(++counter); // (8) outに渡される値は加算後
        Logger.out(counter);   // (9) 前行で加算済みの値
        Logger.out(counter++); // (10) outに渡される値は加算前
        Logger.out(counter);   // (11) 前行で加算済みの値
    }
[2020/12/31 12:34:56.789] 0   // (1) 宣言時に代入された「0」
[2020/12/31 12:34:56.789] 1   // (2) counterの値
[2020/12/31 12:34:56.789] 2   // (3) counterの値
[2020/12/31 12:34:56.789] 3   // (4) ++counterで加算後に代入された値
[2020/12/31 12:34:56.789] 3   // (5) counterの値
[2020/12/31 12:34:56.789] 3   // (6) counter++で加算前に代入された値
[2020/12/31 12:34:56.789] 4   // (7) counterの値
[2020/12/31 12:34:56.789] 5   // (8) ++counterで加算後にoutに渡された値
[2020/12/31 12:34:56.789] 5   // (9) counterの値
[2020/12/31 12:34:56.789] 5   // (10) counter++で加算前にoutに渡された値
[2020/12/31 12:34:56.789] 6   // (11) counterの値

問題

実践問題


(1)VSCodeを起動し、ヘッダーメニューの「ファイル」>「フォルダーを開く...」から、「workspace_java_basic」プロジェクトを開いてください。
(2)workspace_java_basic」プロジェクトの「net.digskill
パッケージの「Expression.java」を開いてください。
※無い場合は「式と演算子」を先に学習しましょう。
(3)Expression」クラス内に次のサンプルコードのメソッドをコピー&ペーストし、
mainから呼び出せるようにして、「F5」で実行できることを確認してください。
※この時点ではターミナルに「3」が3回出力されます。
(4)コメント行に記された各問題文に対し、答えとなるプログラムコードを
問題文の次の空白行以降に書き込み
、「F5」で実行してください。
    static void questionCompound() {
        int a = 1;
        int b = 2;
        int c = 3;

        // (問1)右辺に変数a,b,cを3つとも使用して、
        // 空白行の次にある変数cの出力結果が
        // 「6」となるように変数cに代入してください。
        // なお、他の整数値などを使用してはいけません。

        Logger.out(c);

        // (問2)右辺に変数a,b,cを3つとも使用して、
        // 空白行の次にある変数cの出力結果が
        // 「54」となるように変数cに代入してください。
        // なお、他の整数値などを使用してはいけません。

        Logger.out(c);

        // (問3)右辺に変数a,b,cを3つとも使用して、
        // 空白行の次にある変数cの出力結果が
        // 「-3」となるように変数cに代入してください。
        // なお、他の整数値などを使用してはいけません。

        Logger.out(c);
    }
実行結果例を表示
[2020/12/31 12:34:56.789] 6
[2020/12/31 12:34:56.789] 54
[2020/12/31 12:34:56.789] -3

正解


(問1)正解を表示
c = a + b + c; // 1 + 2 + 3 の結果を代入する

// c = a * b * c; // これも正解!

(問2)正解を表示
c *= a + b + c; // 6 * (1 + 2 + 6) の結果を代入する

(問3)正解を表示
c -= a + b + c; // 54 - (1 + 2 + 54) の結果を代入する

正解プログラムコード全文を表示
    static void questionCompound() {
        int a = 1;
        int b = 2;
        int c = 3;

        // (問1)右辺に変数a,b,cを3つとも使用して、
        // 空白行の次にある変数cの出力結果が
        // 「6」となるように変数cに代入してください。
        // なお、他の整数値などを使用してはいけません。
        c = a + b + c;
        Logger.out(c);

        // (問2)右辺に変数a,b,cを3つとも使用して、
        // 空白行の次にある変数cの出力結果が
        // 「54」となるように変数cに代入してください。
        // なお、他の整数値などを使用してはいけません。
        c *= a + b + c;
        Logger.out(c);

        // (問3)右辺に変数a,b,cを3つとも使用して、
        // 空白行の次にある変数cの出力結果が
        // 「-3」となるように変数cに代入してください。
        // なお、他の整数値などを使用してはいけません。
        c -= a + b + c;
        Logger.out(c);
    }