C言語基礎|複合代入演算子

はじめに:同じ更新処理、もっとスッキリ書けるんです

C言語でプログラムを書いていると、合計や個数、残り回数みたいな値を「更新」する場面がめちゃくちゃ出てきます。

たとえばこんな感じのコード、見覚えありますよね。

  • 合計に値を足す。
  • カウンタを1増やす。
  • 点数を減らす。
  • 料金を倍率で増やす。

この“更新”を 短く・読みやすく 書けるのが、今回のテーマ 複合代入演算子 です。
さらに、カウンタ更新でよく使う インクリメント(++) も一緒に登場して、コードがかなり気持ちよくなります。

サンプル:買い物合計を更新して、平均価格を出す

「商品価格を何回か入力して合計と平均を表示する」プログラムを例に解説します。

プロジェクト名:chap4-4-1 ソースファイル名:chap4-4-1.c

Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。

// 商品価格を繰り返し入力して、合計と平均を表示する
#include <stdio.h>

int main(void)
{
    int sum = 0;     // 合計金額
    int cnt = 0;     // 入力した回数
    int retry;       // 続けるか
    int price;       // 入力した価格

    do {
        printf("価格を入力してください(円):");
        scanf("%d", &price);

        // 更新(ここが今回の主役)
        sum += price;  // sum = sum + price と同じ意味
        cnt++;         // cnt = cnt + 1 と同じ意味

        printf("続けて入力しますか?(はい:0/いいえ:9):");
        scanf("%d", &retry);

    } while (retry == 0);

    printf("合計は%d円です。\n", sum);
    printf("平均は%.2f円です。\n", (double)sum / cnt);

    return 0;
}

実行例

価格を入力してください(円):120
続けて入力しますか?(はい:0/いいえ:9):0
価格を入力してください(円):300
続けて入力しますか?(はい:0/いいえ:9):0
価格を入力してください(円):80
続けて入力しますか?(はい:0/いいえ:9):9
合計は500円です。
平均は166.67円です。

複合代入演算子とは?(+= など)

複合代入演算子は、ざっくり言うと

  • 何かの演算をして
  • その結果を同じ変数に代入する

この2ステップを 1つの演算子でまとめて書けるものです。

例:sum の更新を比べる

書き方意味
sum = sum + price;sum に price を足した結果を sum に入れ直す
sum += price;sum に price を足す(更新する)

どっちも意味はほぼ同じですが、+= のほうが「更新してる感」が強くて読みやすいことが多いです。

複合代入演算子は「演算+代入」のセット

sum += price のイメージ

sum += price
  ↓
sum = sum + price

これがまさに「一人二役」ってやつですね。

複合代入演算子の一覧(10種類)

C言語の複合代入演算子は全部で10個あります。

表:複合代入演算子

形式ほぼ同じ意味の式ざっくり用途
a += ba = a + b加算して更新
a -= ba = a - b減算して更新
a *= ba = a * b掛け算して更新
a /= ba = a / b割り算して更新
a %= ba = a % b余りで更新
a <<= ba = a << b左シフトで更新
a >>= ba = a >> b右シフトで更新
a &= ba = a & bANDで更新
a ^= ba = a ^ bXORで更新
a |= ba = a | bORで更新

ここではまず、日常的に登場しやすい += と -= と *= を使いこなせると強いです。

重要ポイント:a @= b は「a の評価が1回だけ」

ここ、地味に大事です。
※@:複合代入演算子

複合代入演算子は基本的に a = a @ b と同じ意味ですが、a が複雑な式のときに違いが出ることがあります。
イメージとしては、

  • a @= b は「更新対象 a を一度だけ見て更新する」

という感じです。

(序章では深入りしすぎないでOK。配列やポインタが絡むときに効いてきます。)

インクリメント演算子 ++ とは?(cnt++ の正体)

cnt++ は cnt の値を1増やす 演算子です。
これも「更新の省略形」で、次の2つとほぼ同じです。

書き方意味
cnt = cnt + 1;cnt を 1 増やす
cnt += 1;cnt を 1 増やす
cnt++;cnt を 1 増やす(いちばん短い)

今回のサンプルで cnt は「入力した回数」なので、毎回 1 ずつ増えるのが自然ですよね。

合計と個数が更新される流れ(サンプルの中身)

サンプルプログラムのループ本体では、毎回この2つが更新されます。

  • sum は price を足していく。
  • cnt は 1 ずつ増えていく。

更新の流れ

初期値:sum = 0, cnt = 0

1回目:price = 120  → sum = 120, cnt = 1
2回目:price = 300  → sum = 420, cnt = 2
3回目:price = 80   → sum = 500, cnt = 3

表:更新結果の例

回数(cnt)入力(price)合計(sum)
0-0
1120120
2300420
380500

この表を頭に入れると、sum += price; cnt++; の意味が一気にスッと入ります。

よく使う例(短い実例で感覚を掴む)

表:複合代入のよくある使い方

コード意味例(元の値→更新後)
a *= 3;a を3倍にするa=5 → 15
b -= 10;b を10減らすb=17 → 7
total += fee;料金を加算するtotal=200, fee=50 → 250
i++;カウンタを1増やすi=0 → 1

まとめ:複合代入を使うと「更新」が読みやすくなる

  • 複合代入演算子は、演算と代入をまとめて書ける。
  • とくに += は合計や累積で超頻出
  • ++ はカウンタ更新の定番
  • 更新処理が短くなると、プログラム全体がスッキリしてミスも減りやすい。

「何をしているか」が見えやすくなるのが一番のメリットです。