代入・単項演算子

目次
  • 解説
  • 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に再代入する
.=A .= B「A = A . B」と同じ
AにBを結合し、結果をAに再代入する

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

    static function practiceCompound() {
        $intVariable = 1;
        Logger::echo($intVariable);
        $intVariable += 100;        // $intVariable + 100
        Logger::echo($intVariable);
        $intVariable -= 50;         // $intVariable - 50
        Logger::echo($intVariable);
        $intVariable *= 4;          // $intVariable * 4
        Logger::echo($intVariable);
        $intVariable /= 6;          // $intVariable / 6
        Logger::echo($intVariable);
        $intVariable %= 8;          // $intVariable % 8
        Logger::echo($intVariable);
        $stringVariable = 'こんにちは ';
        $stringVariable .= 'DigSkillさん!'; // $stringVariable . DigSkillさん!
        Logger::echo($stringVariable);

        $intVariable *= 1 + 2 + 3;  // $intVariable = $intVariable * (1 + 2 + 3)
        Logger::echo($intVariable);
    }
[2020/12/31 12:34:56] 1    // 定義時に代入された「1」
[2020/12/31 12:34:56] 101  // 「1」に「100」を加算
[2020/12/31 12:34:56] 51   // 「101」から「50」を減算
[2020/12/31 12:34:56] 204  // 「51」に「4」を乗算
[2020/12/31 12:34:56] 34   // 「204」から「6」を除算
[2020/12/31 12:34:56] 2    // 「34」から「8」を除算したあまり
[2020/12/31 12:34:56] こんにちは DigSkillさん! // 「こんにちは 」に「DigSkillさん!」を結合
[2020/12/31 12:34:56] 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 function practiceUnary() {
        $counter = 0;
        Logger::echo($counter);   // (1)
        ++$counter;               // 前置加算演算子
        Logger::echo($counter);   // (2) 前行で加算済みの値
        $counter++;               // 後置加算演算子
        Logger::echo($counter);   // (3) 前行で加算済みの値

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

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

問題

実践問題


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

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

        Logger::echo($c);

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

        Logger::echo($c);

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

        Logger::echo($c);
    }
実行結果例を表示
[2020/12/31 12:34:56] 6
[2020/12/31 12:34:56] 54
[2020/12/31 12:34:56] -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 function questionCompound() {
        $a = 1;
        $b = 2;
        $c = 3;

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

        $c = $a + $b + $c; // 1 + 2 + 3 の結果を代入する

        // c = a * b * c; // これも正解!
        Logger::echo($c);

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

        $c *= $a + $b + $c; // 6 * (1 + 2 + 6) の結果を代入する

        Logger::echo($c);

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

        $c -= $a + $b + $c; // 54 - (1 + 2 + 54) の結果を代入する

        Logger::echo($c);
    }