C言語入門|インクリメント・デクリメント演算子を理解する:前置と後置の評価タイミングの違い

これまでに、= や += などの代入演算子を学んできましたね🙂
その流れで登場するのが、インクリメント演算子デクリメント演算子です。

「1だけ増やしたい」「1だけ減らしたい」
そんな場面は、プログラムでは本当によく出てきます。

たとえば、
回数を数える。
番号を順番に進める。
ループの回数を制御する。

こうした処理では、

a = a + 1;


と毎回書くより、もっとスッキリ書けたら嬉しいですよね😊

そこで用意されているのが、インクリメント・デクリメント演算子です。

インクリメント・デクリメント演算子とは?

インクリメント・デクリメント演算子は、変数の値を1だけ増やす/減らすための演算子です。

代表的なものを整理すると、次のようになります👇

演算子機能評価のタイミング意味
++a1増やす(前置)先に増やすa = a + 1
a++1増やす(後置)後で増やすa = a + 1
--a1減らす(前置)先に減らすa = a - 1
a--1減らす(後置)後で減らすa = a - 1

どれも「最終的に1増える/1減る」という点は同じですが、
式の中で使ったときの評価タイミングが異なります。

ここが、この演算子の一番のクセであり、
初心者がつまずきやすいポイントです😅

単独で使う場合は違いがない

まずは、シンプルな使い方を見てみましょう。

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

このプログラムでは、

  1. a に 100 が入る。
  2. a++ によって a が 1 増える。
  3. a の値(101)が表示される。

という流れになります。

出力は次のとおりです。

101

このように、インクリメント演算子を単独で使う場合は、
++a でも a++ でも結果は同じになります🙂

このため、最初のうちは
「どっちを使っても同じじゃん?」
と感じる人も多いでしょう。

でも、本当の違いはここからです⚠️

単項演算子という仲間

インクリメント・デクリメント演算子は、オペランドを1つしか持たない演算子です。

こうした演算子は、まとめて
単項演算子(unary operator)
と呼ばれます。

+ や * のように左右に値を取る演算子とは違い、
++a のように、1つの変数だけを対象に処理します。

ここまでは特に難しくありませんね😊

前置と後置で何が違うのか?

問題になるのは、ほかの演算子と一緒に使ったときです。

次のコードを見てください。

int a = 10;
int b = 10;
printf("%d\n", ++a + 50);
printf("%d\n", b++ + 50);

一見すると、
「どちらも 10 に 1 を足して、さらに 50 を足す」
ように見えますよね。

でも、実際の出力はこうなります。

61
60

えっ、なんで違うの?😳
ここで、前置と後置の評価タイミングの違いがはっきり表れます。

前置インクリメントの評価の流れ

まず、++a + 50 の処理を順番に見てみましょう。

++a + 50

この場合の流れは次のとおりです👇

  1. 変数 a の値が 1 増える(10 → 11)
  2. 増えたあとの a の値(11)に 50 を足す。
  3. 61 が表示される。

つまり、前置インクリメントは「先に増やす」のです。

後置インクリメントの評価の流れ

次に、b++ + 50 を見てみましょう。

b++ + 50

こちらの流れはこうなります👇

  1. まず b の現在の値(10)を使って 50 を足す。
  2. その結果(60)が表示される。
  3. 式の評価が終わったあとで b の値が 1 増える(10 → 11)

つまり、後置インクリメントは「あとで増やす」のです。

この違いをまとめると、

  • ++a:使う前に増える
  • a++:使ったあとに増える

ということになります🙂

なぜバグの原因になりやすいのか

インクリメント・デクリメント演算子は、
優先順位が非常に高い
という特徴があります。

そのため、式の中に入れると、

  • どのタイミングで増えるのか
  • どの値が使われているのか

を正確に把握していないと、
見た目と違う動作になりやすいのです😥

特に、

a = a++ + ++a;

のようなコードは、
読む人にも書いた本人にも優しくありません。

安全な使い方のルール

そのため、学習段階では次のルールを強くおすすめします👍

インクリメント・デクリメント演算子は、単独で使う

a++;
i--;

このように1行で完結させれば、
評価タイミングを誤解することはありません。

特別な理由がない限り、
ほかの演算子と無理に組み合わせない
という姿勢が、バグを遠ざけてくれます😊

まとめ

最後に、感覚的なイメージをまとめておきましょう。

  • インクリメント・デクリメント演算子は値を1だけ変える。
  • 前置は「先に変えてから使う」
  • 後置は「使ってから変える」
  • 単独で使えば安全
  • 式の中で使うときは慎重に

このポイントを押さえておけば、
次に出てくる for 文や while 文でも迷わなくなりますよ✨