C言語では、変数の値を1だけ増やしたり減らしたりする場面がとても多くあります。
特に繰り返し処理やカウンタの更新ではインクリメント(++), デクリメント(–)が欠かせません。
本記事では、C言語初心者の方にも分かりやすいように、++と–の基本から、for文やwhile文での使い方、i++と++iの違いまで、順番に丁寧に解説していきます。
C言語の++と–とは何か
++(インクリメント)で値を1増やす基本
C言語におけるインクリメント演算子は++です。
これは変数の値を1だけ増やすための専用の演算子です。
たとえば、次のようなコードを考えます。
#include <stdio.h>
int main(void) {
int x = 5;
// xの値を1増やす
x++; // または ++x; いずれもこの行だけ見れば「1増える」という意味
printf("xの値は%dです。\n", x); // 6と表示される
return 0;
}
このプログラムでは、最初にxを5で初期化し、その後x++で1増やしています。
実行すると、6が出力されます。
xの値は6です。
インクリメント演算子は「1増やす専用のショートカット」と考えると分かりやすいです。
–(デクリメント)で値を1減らす基本
一方、デクリメント演算子は--です。
こちらは変数の値を1だけ減らすための演算子です。
#include <stdio.h>
int main(void) {
int x = 5;
// xの値を1減らす
x--; // または --x;
printf("xの値は%dです。\n", x); // 4と表示される
return 0;
}
このプログラムではx--によって、5から1引かれて4になります。
xの値は4です。
どんな場面で++と–を使うのか
++と–は、特に「回数を数える」「添え字(インデックス)を進める」場面で頻繁に使われます。
具体的には次のような場面です。
- for文でループ回数を数えるとき
- 配列の要素を順番に処理するとき
- 残り回数を減らしていくカウンタ処理をするとき
たとえば、0から9までの数を表示するプログラムでは、次のようにi++を使うことが多いです。
#include <stdio.h>
int main(void) {
int i;
// 0から9までを表示
for (i = 0; i < 10; i++) { // ここでi++を使用
printf("%d\n", i);
}
return 0;
}
0
1
2
3
4
5
6
7
8
9
このようにループ処理と++/–はセットで覚えると理解しやすくなります。
++と–の書き方と使い方の基本
変数の値を1増やす書き方
インクリメント演算子には2つの書き方があります。
- 後置インクリメント:
i++ - 前置インクリメント:
++i
「その行だけを単独で使う」場合には、どちらも「1増える」という意味は同じです。
#include <stdio.h>
int main(void) {
int a = 10;
int b = 10;
a++; // aの値を1増やす
++b; // bの値を1増やす
printf("a = %d\n", a); // 11
printf("b = %d\n", b); // 11
return 0;
}
a = 11
b = 11
初心者のうちは、「1増やすだけならどちらでもいい」と考え、書き方を統一しておくと混乱が少なくなります。
変数の値を1減らす書き方
デクリメント演算子も同様に2つの書き方があります。
- 後置デクリメント:
i-- - 前置デクリメント:
--i
単独の文として使う場合は、どちらも変数の値を1だけ減らすという意味になります。
#include <stdio.h>
int main(void) {
int a = 10;
int b = 10;
a--; // aの値を1減らす
--b; // bの値を1減らす
printf("a = %d\n", a); // 9
printf("b = %d\n", b); // 9
return 0;
}
a = 9
b = 9
i = i + 1とi++の違い
i = i + 1;とi++;は、単独の文として使う限り、結果は同じです。
i = i + 1;
「今のiに1を足して、その結果をiに代入する」i++;
「iを1だけ増やす」
初心者が理解しやすいように、両者を比較してみます。
#include <stdio.h>
int main(void) {
int i, j;
i = 5;
j = 5;
i = i + 1; // iは6になる
j++; // jも6になる
printf("i = %d\n", i);
printf("j = %d\n", j);
return 0;
}
i = 6
j = 6
意味も結果も同じですが、++を使った方が短く書けて、Cらしい書き方になります。
i = i – 1とi–の違い
減らす場合も同様です。
i = i - 1;とi--;は、単独の文として見れば動作は同じです。
#include <stdio.h>
int main(void) {
int i, j;
i = 5;
j = 5;
i = i - 1; // iは4になる
j--; // jも4になる
printf("i = %d\n", i);
printf("j = %d\n", j);
return 0;
}
i = 4
j = 4
まずは「1増やす/減らすときには++/–を使う」と覚えると、C言語のコードを読みやすく書きやすくできます。
代入式との組み合わせ
インクリメント・デクリメントは、代入式の中に組み込んで使うこともできます。
ただし、組み合わせ方によっては挙動が分かりにくくなるため、初心者は注意が必要です。
まずは、動作が分かりやすい安全な組み合わせの例を見てみます。
#include <stdio.h>
int main(void) {
int i = 5;
int a, b;
// 後置インクリメントとの組み合わせ
a = i; // 先に代入
i++; // その後でiを1増やす
// 状態を確認
printf("a = %d, i = %d\n", a, i); // a=5, i=6
// 前置インクリメントとの組み合わせ(分かりやすい例)
b = i + 1; // bに「i+1」の値を代入するという意味で考えると理解しやすい
printf("b = %d, i = %d\n", b, i); // b=7, i=6
return 0;
}
a = 5, i = 6
b = 7, i = 6
実際にはb = ++i;のように直接書くこともできますが、C言語初心者にとっては「前置/後置の違い」が一気に難しくなるポイントです。
この点については後半の「i++と++iの違い」で詳しく説明し、初心者がとりあえず避けるべき書き方もあわせて紹介します。
for文でのインクリメント・デクリメント活用
for文の基本構造と++の使い方
C言語のfor文は、繰り返し処理を行う代表的な構文です。
基本構造は次のようになります。
for (初期化; 条件式; 更新処理) {
繰り返したい処理;
}
この更新処理の部分で++や–がよく使われます。
#include <stdio.h>
int main(void) {
int i;
// 0から4までの数値を表示
for (i = 0; i < 5; i++) { // i++が「カウンタを1ずつ増やす」役割
printf("i = %d\n", i);
}
return 0;
}
i = 0
i = 1
i = 2
i = 3
i = 4
ここでのi++は、ループが1回終わるごとにiの値を1増やすという意味です。
for文とインクリメントはセットで覚えると良いです。
カウンタ変数を–で減らしていくfor文
逆に、値を減らしながら繰り返したい場合には、更新処理の部分をi--にします。
#include <stdio.h>
int main(void) {
int i;
// 5から1までカウントダウン
for (i = 5; i >= 1; i--) { // i--で1ずつ減らす
printf("カウントダウン: %d\n", i);
}
return 0;
}
カウントダウン: 5
カウントダウン: 4
カウントダウン: 3
カウントダウン: 2
カウントダウン: 1
このように「上に向かって数えるときは++」「下に向かって数えるときは–」と覚えておくと、for文を設計しやすくなります。
配列の繰り返し処理での++と–の使い方
配列を扱うときにも、添え字(インデックス)を増やす/減らすために++や–を使います。
以下は、配列の全要素を順番に表示する例です。
#include <stdio.h>
int main(void) {
int a[5] = {10, 20, 30, 40, 50};
int i;
// 先頭から末尾へ
printf("先頭から末尾へ:\n");
for (i = 0; i < 5; i++) { // i++で添え字を進める
printf("a[%d] = %d\n", i, a[i]);
}
// 末尾から先頭へ
printf("末尾から先頭へ:\n");
for (i = 4; i >= 0; i--) { // i--で添え字を戻していく
printf("a[%d] = %d\n", i, a[i]);
}
return 0;
}
先頭から末尾へ:
a[0] = 10
a[1] = 20
a[2] = 30
a[3] = 40
a[4] = 50
末尾から先頭へ:
a[4] = 50
a[3] = 40
a[2] = 30
a[1] = 20
a[0] = 10
配列の添え字と++/–はとても相性が良く、C言語の典型的な書き方です。
while文・do while文での++と–
for文だけでなく、while文やdo while文でも++/–を使います。
ただし、for文と違い「どこでカウンタを更新するか」を自分で書く必要があります。
#include <stdio.h>
int main(void) {
int i = 0;
// while文で0〜4を表示
while (i < 5) {
printf("i = %d\n", i);
i++; // ここでiを1増やさないと無限ループになる
}
// do while文で5〜1を表示
int j = 5;
do {
printf("j = %d\n", j);
j--; // ここで1減らす
} while (j > 0);
return 0;
}
i = 0
i = 1
i = 2
i = 3
i = 4
j = 5
j = 4
j = 3
j = 2
j = 1
while文やdo while文では、++/–を書き忘れると無限ループになりやすいので注意が必要です。
i++と++iの違い
ここからは、C言語初心者にとってつまずきやすい「後置インクリメント(i++)」と「前置インクリメント(++i)」の違いを丁寧に説明します。
単独の文として使うときには違いはありませんが、「式の一部」として使ったときに挙動が変わります。
後置インクリメント(i++)の動き
後置インクリメント(cst-code>i++)は、「今の値を使ってから、最後に1増やす」という動きをします。
次のプログラムで、実際の動きを確認してみましょう。
#include <stdio.h>
int main(void) {
int i = 5;
int a;
a = i++; // aに「今のiの値」を代入し、その後でiを1増やす
printf("a = %d\n", a); // 5
printf("i = %d\n", i); // 6
return 0;
}
a = 5
i = 6
ここでのポイントを表に整理します。
| 文 | aの値 | iの値 | 説明 |
|---|---|---|---|
| 初期状態 | – | 5 | iを5で初期化 |
| a = i++; 実行 | 5 | 6 | aに5を代入してから、iが6に増える |
「右辺の値としては、増える前の値を使う」と覚えておくと理解しやすいです。
前置インクリメント(++i)の動き
前置インクリメント(cst-code>++i)は、「先に1増やしてから、その新しい値を使う」という動きをします。
同じように、プログラムで確認してみます。
#include <stdio.h>
int main(void) {
int i = 5;
int a;
a = ++i; // 先にiを1増やし、その新しい値をaに代入する
printf("a = %d\n", a); // 6
printf("i = %d\n", i); // 6
return 0;
}
a = 6
i = 6
こちらも表にして比較してみます。
| 文 | aの値 | iの値 | 説明 |
|---|---|---|---|
| 初期状態 | – | 5 | iを5で初期化 |
| a = ++i; 実行 | 6 | 6 | iを6に増やしてから、その6をaに代入する |
「前置は『先に増やす』、後置は『後で増やす』」というイメージが重要です。
代入と一緒に使ったときの違い
後置(i++)と前置(++i)を並べて比較してみましょう。
#include <stdio.h>
int main(void) {
int i = 5;
int a, b;
a = i++; // 後置: aに5を代入してから、iが6になる
i = 5; // iをリセット
b = ++i; // 前置: 先にiを6にしてから、その6をbに代入
printf("後置: a = %d (i = %dのとき)\n", a, 6);
printf("前置: b = %d (i = %dのとき)\n", b, i);
return 0;
}
実際には次のような出力になります。
後置: a = 5 (i = 6のとき)
前置: b = 6 (i = 6のとき)
この例から「代入と一緒に使うと、a = i++ と a = ++i ではaに入る値が変わる」ことが分かります。
条件式の中で使うときの注意点
C言語では、if文やwhile文などの条件式の中に++/–を書くことも技術的には可能です。
#include <stdio.h>
int main(void) {
int i = 0;
while (i++ < 5) { // 条件式の中でi++を使っている例
printf("i = %d\n", i);
}
return 0;
}
i = 1
i = 2
i = 3
i = 4
i = 5
しかし、このような書き方は初心者には非常に分かりにくく、バグの原因になりやすいです。
安全な書き方のコツとしては、次のように「条件式」と「インクリメント」を分けて書くことをおすすめします。
#include <stdio.h>
int main(void) {
int i = 0;
while (i < 5) { // 条件式はシンプルに
i++; // 増やす処理はブロック内に分けて書く
printf("i = %d\n", i);
}
return 0;
}
このように分けて書くと、「いつiが増えるのか」「条件は何なのか」がはっきりして読みやすくなります。
C言語初心者が避けるべき書き方と安全な使い方
C言語では、++や–を使って非常に難解でバグを生みやすい書き方をすることも可能です。
初心者のうちに避けるべき典型的な例と、安全な書き方を整理しておきます。
避けるべき書き方の例
次のような書き方は、動作の順番が分かりにくく、熟練者でもバグを生みやすいため、初心者のうちは避けてください。
// 悪い例(避ける)
i = i++ + ++i;
a[i++] = i--;
if (i++ < ++j) { ... }
このような式では、「どのタイミングで増えるのか」「どの値が使われるのか」を正確に追う必要があり、非常に理解しにくくなります。
安全な使い方の基本方針
初心者のうちは、次のルールに従うと安全です。
- ++や–は、できるだけ「単独の文」で使う
例:i++;/--j; - for文では「更新処理」の場所で使う
例:for (i = 0; i < n; i++) - 代入式・条件式の中に++/–を書き込まない
どうしても使いたい場合は、i = i + 1;やi = i - 1;に書き換えて、処理を明確にする。
次の例は、読みやすく、安全な使い方にしたバージョンです。
#include <stdio.h>
int main(void) {
int i = 0;
int sum = 0;
// 悪い例: sum = ++i + i++;
// 良い例: 処理を分解して書く
i = i + 1; // 1回目のインクリメント
sum = sum + i; // 1回目の加算
i = i + 1; // 2回目のインクリメント
sum = sum + i; // 2回目の加算
printf("i = %d, sum = %d\n", i, sum);
return 0;
}
i = 2, sum = 3
「処理を細かく分けて書く」ことは、バグを減らし、デバッグをしやすくするための重要なテクニックです。
慣れてきたら少しずつ式を短くしても良いですが、最初から難しい書き方に挑戦しないことが上達への近道です。
まとめ
C言語における++と–は、値を1だけ増減させるための基本かつ重要な演算子です。
インクリメント(++), デクリメント(–)は、特にfor文・while文でのカウンタ処理や、配列の添え字操作で頻繁に登場します。
前置(++i)と後置(i++)には「いつ値が増えるか」という違いがありますが、初心者のうちは単独の文として使う・条件式や複雑な代入式の中に埋め込まないというルールを守ると安全です。
まずは、for文のi++からしっかり使いこなし、徐々に前置・後置の違いにも慣れていくと良いでしょう。
