3秒でわかる
値を一定量だけ増やす操作。多くの言語で ++ や += 1 と書き、ループの回数を進めたりカウンタを数えたりするときに毎回登場します。
もう少し詳しく
どういうものか
インクリメントは、変数の値を 1 つ (あるいは決めた量) 増やす操作である。C 系の言語では i++ や ++i、増やす量を指定する場合は i += 3 と書く。反対に減らす操作をデクリメントと呼び、i-- と書く。
Python には ++ 演算子が無く、i += 1 と書く。++i と書いても構文エラーにはならないが、正の符号を 2 回付けているだけなので値は変わらない。
なぜ必要か
繰り返しの制御と数え上げは、プログラムの中で最も頻繁に現れる処理である。for (int i = 0; i < n; i++) の最後の項がインクリメントで、これが無いと条件が変わらず無限ループになる。
配列の添字を進める、処理した件数を数える、リトライ回数を数えるといった場面で、値を 1 進めるだけの操作に短い書き方が用意されている。
具体例
前置と後置で、式全体が返す値が変わる。
#include <stdio.h>
int main(void) {
int i = 5;
printf("%d\n", i++); // 5 を表示してから 6 になる (後置)
printf("%d\n", i); // 6
int j = 5;
printf("%d\n", ++j); // 6 になってから 6 を表示する (前置)
int a[3] = {10, 20, 30};
int k = 0;
printf("%d\n", a[k++]); // a[0] の 10 を読み、k は 1 になる
return 0;
}単独の文として書く場合、i++ と ++i に違いは無い。値を使う式の中に置いたときだけ差が出る。
つまずきやすいところ
1 つの式の中で同じ変数を 2 回以上いじると、C や C++ では動作が保証されない。i = i++ + ++i; のようなコードは、コンパイラによって結果が変わる。試験問題では見かけるが、実務では書かない。
Java や JavaScript は評価順が言語仕様で決まっているため結果は定まるが、読み手に負担をかけるので分けて書く。
もう 1 つ、複数のスレッドから同じカウンタをインクリメントすると値がずれる。count++ は「読む、足す、書く」の 3 段階で、途中で別のスレッドが割り込むと片方の加算が消える。Java なら AtomicInteger、データベースなら UPDATE ... SET n = n + 1 のように、不可分に処理する手段を使う。
似た用語との違い
アジャイル開発の文脈では、インクリメントはスプリントで積み上がる「動くソフトウェアの増分」を指す。演算子の話とは別物で、こちらは前のスプリントの成果に今回の成果を足した合計を意味する。検索結果にどちらの記事も混ざるため、文脈を先に確かめる。