C言語基礎|後置増分演算子と後置減分演算子

はじめに:カウンタ更新は「短く・正確に」書けると気持ちいい

プログラムを書いていると、回数を数える変数とか、残り回数を管理する変数って、ほんとに頻繁に出てきます。

  • 1回処理したら回数を1増やす。
  • 1回使ったら残りを1減らす。

この「1だけ増やす/1だけ減らす」を、スッと書けるのが
後置増分演算子 ++後置減分演算子 -- です。

しかもこの2つ、ただ短いだけじゃなくて、式の中で使ったときの値がちょっと独特なんです。
そこも含めて、やさしく整理していきますね。

サンプル:クーポンを使った回数を数え、残り回数を減らす

「クーポンを最大3回まで使える。使うたびに使用回数を増やし、残り回数を減らす」プログラムを例に解説します。

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

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

// クーポン使用回数を数え、残り回数を減らす
#include <stdio.h>

int main(void)
{
    int used = 0;      // 使った回数
    int remaining = 3; // 残り回数
    int ans;           // 使うかどうか

    do {
        printf("クーポンを使いますか?(はい:1/いいえ:0):");
        scanf("%d", &ans);

        if (ans == 1 && remaining > 0) {
            used++;        // 後置増分:使った回数を1増やす
            remaining--;   // 後置減分:残り回数を1減らす

            printf("クーポンを使いました。使用回数=%d、残り=%d\n", used, remaining);
        } else if (ans == 1 && remaining == 0) {
            printf("もうクーポンは使えません(残り0回)\n");
        } else {
            printf("今回は使いませんでした。\n");
        }

    } while (ans == 1);

    printf("終了します。最終的な使用回数=%d、残り=%d\n", used, remaining);
    return 0;
}

実行例

クーポンを使いますか?(はい:1/いいえ:0):1
クーポンを使いました。使用回数=1、残り=2
クーポンを使いますか?(はい:1/いいえ:0):1
クーポンを使いました。使用回数=2、残り=1
クーポンを使いますか?(はい:1/いいえ:0):1
クーポンを使いました。使用回数=3、残り=0
クーポンを使いますか?(はい:1/いいえ:0):1
もうクーポンは使えません(残り0回)
クーポンを使いますか?(はい:1/いいえ:0):0
終了します。最終的な使用回数=3、残り=0

後置増分演算子 a++ と後置減分演算子 a-- って何?

まずは基本から。a++ と a-- は次の意味です。

後置増分演算子と後置減分演算子

種類演算子説明
後置増分演算子a++a の値を 1 増やす(式全体の値は増やす前の値)
後置減分演算子a--a の値を 1 減らす(式全体の値は減らす前の値)

ここでの「後置」は、演算子が変数の 後ろ に付くからです。
used++ のように書きます。

まずは単体で使う:a++ は a を1増やす(読み方はこれでOK)

単独の文として使うなら、理解はめちゃくちゃシンプルです。

ほぼ同じ意味の書き方

やりたいこと通常の書き方短い書き方
1増やすa = a + 1;a++;
1減らすa = a - 1;a--;

だから、サンプルの

  • used++; は「使用回数を1増やす」
  • remaining--; は「残り回数を1減らす」

という意図が、とても分かりやすくなります。

後置増分・後置減分の動き

後置増分 a++ は、イメージとしてはこうです。

a++ の処理
(1) 式の値としては「増やす前の a」を使う
(2) その後で a を 1 増やす

後置減分 a-- はこう。

a-- の処理
(1) 式の値としては「減らす前の a」を使う
(2) その後で a を 1 減らす

単独の文なら (1) の「式の値」は表に出ないので、
結果として「1増える/1減る」とだけ覚えておけばOKです。

大事ポイント:式の中で使うと「増やす前の値」が使われる

ここが後置の特徴で、つまずきやすいところでもあります。

たとえば、次のコードを見てください。

int a = 5;
printf("%d\n", a++);
printf("%d\n", a);

この出力はこうなります。

  • 1行目:5(増や前の値が表示される)
  • 2行目:6(その後 a が増えている)

a++ を式の中で使ったとき

タイミングa の値式 a++ の値
評価の瞬間55
評価が終わった後6(式の値はもう使い終わっている)

同じように a-- も「減らす前」が式の値になります。

よく使う場面:ループのカウンタと残量管理

++ と -- が活躍する代表例はこれです。

典型的な用途

目的意味
回数を数えるi++;カウンタを1増やす
残り回数を減らすremaining--;残量を1減らす
配列を順に見るidx++;次の要素へ進む

「1ずつ動かす」操作は本当に多いので、今後ほぼ毎章のように登場します。

ここで登場した命令の書式まとめ

後置増分演算子

書式何をする?
変数++変数の値を1増やす(式の値は増やす前)

後置減分演算子

書式何をする?
変数--変数の値を1減らす(式の値は減らす前)

まとめ:後置 ++ / -- は「短くて読みやすい更新」の定番

  • a++ は a を 1 増やす(インクリメント)
  • a-- は a を 1 減らす(デクリメント)
  • 単独の文として使うなら、更新の意味だけでOK
  • 式の中で使うと「増やす前/減らす前」が式の値になる(後置の特徴)

慣れると、コードのテンポが一気に良くなりますよ。