
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 += b | a = a + b | 加算して更新 |
| 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 | 左シフトで更新 |
| a >>= b | a = a >> b | 右シフトで更新 |
| a &= b | a = a & b | ANDで更新 |
| a ^= b | a = a ^ b | XORで更新 |
| a |= b | a = a | b | ORで更新 |
ここではまず、日常的に登場しやすい += と -= と *= を使いこなせると強いです。
重要ポイント: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 |
| 1 | 120 | 120 |
| 2 | 300 | 420 |
| 3 | 80 | 500 |
この表を頭に入れると、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 |
まとめ:複合代入を使うと「更新」が読みやすくなる
- 複合代入演算子は、演算と代入をまとめて書ける。
- とくに += は合計や累積で超頻出
- ++ はカウンタ更新の定番
- 更新処理が短くなると、プログラム全体がスッキリしてミスも減りやすい。
「何をしているか」が見えやすくなるのが一番のメリットです。
