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

はじめに:前置の ++ と -- は「先に更新して、その結果を使う」タイプ

i++ や i--(後置)は「使ってから更新」でしたね。
一方で今回の主役、++i や --i(前置)は 更新してから使う のが特徴です。

  • 前置:先に 1 増やす(減らす)→ その値が式の値になる
  • 後置:先に式の値として使う → その後 1 増やす(減らす)

この違いは、単独で i++; みたいに書くと分かりにくいのですが、
printf("%d", ++i); のように 式の中で使った瞬間に、しっかり差が出ます。

サンプル:目標回数だけ入力して、最大値と最小値を表示する

指定回数の整数を入力し、最大値と最小値を表示するプログラムを例に解説をします。

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

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

// 指定された個数の整数を読み込み、最大値と最小値を表示
#include <stdio.h>

int main(void)
{
    int count;

    printf("いくつ入力しますか:");
    scanf("%d", &count);

    int i = 0;
    int x;

    printf("1回目の値を入力してください:");
    scanf("%d", &x);

    int max = x;
    int min = x;

    while (++i < count) {   // 先に i を増やしてから判定に使う
        printf("%d回目の値を入力してください:", i + 1);
        scanf("%d", &x);

        if (x > max) max = x;
        if (x < min) min = x;
    }

    printf("最大値:%d\n", max);
    printf("最小値:%d\n", min);

    return 0;
}

実行例

いくつ入力しますか:4
1回目の値を入力してください:10
2回目の値を入力してください:3
3回目の値を入力してください:18
4回目の値を入力してください:7
最大値:18
最小値:3

前置増分演算子・前置減分演算子とは(書式と役割)

前置演算子の基本

種類書式何をする?式全体の値は?
前置増分演算子++aa を 1 増やす増やした後の値
前置減分演算子--aa を 1 減らす減らした後の値

「式の値が更新後」というのが、前置のいちばん大事な性格です。

後置との違いを並べて理解しよう(ここが核心)

前置と後置の違い

種類書式変数の更新式として得られる値
前置++i先に増える増えた後の i
後置i++後で増える増える前の i
前置--i先に減る減った後の i
後置i--後で減る減る前の i

評価の順番(前置は「更新 → 使用」、後置は「使用 → 更新」)

たとえば i が 0 のときに評価するとこうなります。

増分演算式の評価

前置 ++i
  i を 1 増やす → i は 1
  式の値は 1

後置 i++
  式の値は 0
  その直後に i を 1 増やす → i は 1

この「式の値がどっちになるか」が、printf や while 条件の中で効いてきます。

サンプルのこの行がポイントでした。

while (++i < count)

while (++i < count) の中身(日本語)

(1) まず i を 1 増やす
(2) 増えた i と count を比較する
(3) 真ならループ本体へ、偽なら終了

もし i++ < count にすると、比較に使われるのが増える前の値になり、
ループ回数やタイミングが変わることがあります。
こういう「条件式の中で使う」ときに、前置・後置の差が目に見えて出ます。

前置演算子のよくある使いどころ

前置 ++/-- が読みやすくなる場面

場面うれしい点
先に番号を進めてから使うprintf("%d回目", ++i);表示が自然(1,2,3…)
先に更新してから判定while (++i < n)判定と更新の意図が一致
デクリメントしてから使う--remain;残り数を先に減らして扱える

注意:単独で使う場合は前置と後置は見た目の差が出にくい

例えば次の2つは、単独文としては動きがほぼ同じです。

i++;
++i;

どちらも「i が 1 増える」だけなので、単独なら違いが表に出ません。
違いが出るのは、式の値が使われるとき(printf、代入、条件式など)です。

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

前置増分・前置減分

書式意味
++aa を 1 増やし、その値を式の値として返す。
--aa を 1 減らし、その値を式の値として返す。

while文

書式意味
while (式) 文式が真の間、文を繰り返す。
while (式) { ... }式が真の間、ブロックを繰り返す。

まとめ:前置は「更新後の値が欲しい」ときに使うとスッキリする

  • 前置 ++a / --a は「先に更新して、その値が式の値」
  • 後置 a++ / a-- は「先に式の値として使って、その後更新」
  • 単独文では差が見えにくいけれど、条件式や表示で差が出る
  • ループ回数や番号付けの意図に合わせて、前置・後置を選ぶのがコツ