6日でできる 新C言語入門|インクリメント・デクリメント

1増やす、1減らすを短く書ける。
インクリメント・デクリメントを理解して、for文やカウント処理をすっきり書けるようになろう。

C言語では、変数の値を1つ増やしたり、1つ減らしたりする処理がよく登場します。たとえば、繰り返し処理で回数を数えるとき、在庫数を1つ減らすとき、カウンタを1ずつ進めるときなどです。

このような1ずつ増やす処理をインクリメント、1ずつ減らす処理をデクリメントと呼びます。

通常、変数を1増やす場合は、次のように書けます。

count = count + 1;

または、代入演算子を使って次のようにも書けます。

count += 1;

C言語では、これをさらに短く書くために、インクリメント演算子である++を使えます。

count++;

同じように、変数を1減らす場合は、デクリメント演算子である--を使えます。

count--;

インクリメントとデクリメントは、for文やwhile文などの繰り返し処理でとてもよく使われます。特にfor文では、i++やi--のように、ループ変数を更新するために使う場面が多くあります。

ただし、インクリメント・デクリメントには、前置と後置という書き方があります。単独で使う場合は結果が同じに見えますが、代入や式の中で使うと、値が使われるタイミングが変わります。ここを理解しておくと、思わぬ結果を避けやすくなります。

この記事では、インクリメント・デクリメントの基本、前置と後置の違い、for文での使い方、増減幅を変えたい場合の書き方、注意点まで、サンプルプログラムを使いながらやさしく解説していきます。

インクリメントは1増やす処理

インクリメントは、変数の値を1増やす処理です。C言語では、++を使って書きます。

たとえば、countの値を1増やしたい場合は、次のように書けます。

count++;

これは、次の書き方と同じ意味です。

count = count + 1;

また、代入演算子を使った次の書き方とも同じ意味です。

count += 1;

表で整理すると、次のようになります。

書き方意味
count = count + 1;countの値を1増やす
count += 1;countの値を1増やす
count++;countの値を1増やす
++count;countの値を1増やす

単独で使う場合、count++と++countはどちらもcountを1増やします。
違いが出るのは、代入や計算式の中で使った場合です。

デクリメントは1減らす処理

デクリメントは、変数の値を1減らす処理です。C言語では、--を使って書きます。

たとえば、countの値を1減らしたい場合は、次のように書けます。

count--;

これは、次の書き方と同じ意味です。

count = count - 1;

また、代入演算子を使った次の書き方とも同じ意味です。

count -= 1;

表で整理すると、次のようになります。

書き方意味
count = count - 1;countの値を1減らす
count -= 1;countの値を1減らす
count--;countの値を1減らす
--count;countの値を1減らす

デクリメントも、単独で使うだけならcount--と--countの結果は同じです。どちらもcountを1減らします。

図:インクリメントとデクリメントの基本

この図から分かること

この図から分かるのは、インクリメントとデクリメントが変数の値を1だけ変化させるための短い書き方だということです。

count++を使うとcountの値が1増え、count--を使うとcountの値が1減ります。カウント処理や繰り返し処理では、値を1ずつ動かす場面が多いため、++と--はとてもよく使われます。

前置と後置の違い

インクリメントとデクリメントには、演算子を変数の前に置く前置と、変数の後ろに置く後置があります。

書き方呼び名処理内容
i++後置インクリメントiの値を使ったあとに1増やす
++i前置インクリメントiを1増やしてから値を使う
i--後置デクリメントiの値を使ったあとに1減らす
--i前置デクリメントiを1減らしてから値を使う

単独で次のように使う場合は、前置でも後置でも結果は同じです。

i++;
++i;

どちらもiを1増やします。

しかし、代入と組み合わせると違いが出ます。

a = x++;
b = ++y;

この場合、x++は先にxの値をaへ代入し、そのあとxを1増やします。
一方、++yは先にyを1増やし、その増えた値をbへ代入します。

前置と後置の違いを確認するサンプルプログラム

次のプログラムでは、後置インクリメントと前置インクリメントの違いを確認します。

プロジェクト/ファイル名: Lesson26_1/main.c

#include <stdio.h>

int main(void) {
    int x = 4;
    int after_value;

    int y = 4;
    int before_value;

    // 後置インクリメントは、現在の値を使ってから1増やす
    after_value = x++;

    // 前置インクリメントは、1増やしてから値を使う
    before_value = ++y;

    // 後置インクリメントの結果を表示する
    printf("after_valueの値: %d, xの値: %d\n", after_value, x);

    // 前置インクリメントの結果を表示する
    printf("before_valueの値: %d, yの値: %d\n", before_value, y);

    return 0;
}

実行結果

after_valueの値: 4, xの値: 5
before_valueの値: 5, yの値: 5

このプログラムでは、最初にxとyへ4を代入しています。

after_value = x++;では、まずxの現在値である4がafter_valueに代入されます。そのあと、xが1増えて5になります。
そのため、after_valueは4、xは5になります。

一方、before_value = ++y;では、先にyが1増えて5になります。そのあと、増えた後の値がbefore_valueに代入されます。
そのため、before_valueもyも5になります。

後置インクリメントは値を使ってから増やす

後置インクリメントは、変数の値を先に使い、そのあとで1増やします。

after_value = x++;

この流れを分解すると、次のようなイメージです。

手順内容
1xの現在値をafter_valueに代入する
2xの値を1増やす

xが4なら、after_valueには4が入り、そのあとxは5になります。

後置インクリメントは、現在の値を先に利用したい場合に使われます。ただし、慣れないうちは読み間違えやすいので、式の中で使うときは注意が必要です。

前置インクリメントは増やしてから値を使う

前置インクリメントは、変数の値を先に1増やし、その増えた後の値を使います。

before_value = ++y;

この流れを分解すると、次のようなイメージです。

手順内容
1yの値を1増やす
2増えた後のyの値をbefore_valueに代入する

yが4なら、まずyが5になり、その5がbefore_valueに入ります。

前置インクリメントは、増やした後の値をすぐに使いたい場合に使われます。

図:前置と後置では値を使うタイミングが違う

この図から分かること

この図から分かるのは、後置インクリメントと前置インクリメントでは、値を使うタイミングが違うということです。

後置のx++は、現在のxの値を先に使ってから1増やします。前置の++yは、先にyを1増やしてから値を使います。単独で使うと違いが見えにくいですが、代入や計算式の中で使うと結果が変わるため注意が必要です。

デクリメントにも前置と後置がある

デクリメントでも、前置と後置の考え方は同じです。

書き方動き
x--xの値を使ったあとに1減らす
--xxを1減らしてから値を使う

たとえば、xが5のとき、a = x--;と書くと、aには5が入り、そのあとxが4になります。
一方、a = --x;と書くと、先にxが4になり、その4がaに入ります。

インクリメントと同じように、単独で使う場合はどちらも1減らすだけです。ただし、式の中で使う場合は結果が変わります。

for文ではインクリメントがよく使われる

インクリメント・デクリメントは、for文で特によく使われます。

for文では、繰り返しのたびにループ変数を更新します。1ずつ増やす場合はi++、1ずつ減らす場合はi--を使うことが多いです。

たとえば、1から5まで表示するfor文は次のように書けます。

for (i = 1; i <= 5; i++) {
    printf("%d\n", i);
}

この場合、iは1、2、3、4、5と1ずつ増えていきます。

反対に、5から1までカウントダウンする場合は、次のように書けます。

for (i = 5; i > 0; i--) {
    printf("%d\n", i);
}

この場合、iは5、4、3、2、1と1ずつ減っていきます。

for文でデクリメントを使うサンプルプログラム

次のプログラムでは、デクリメントを使ってカウントダウンを行います。

プロジェクト/ファイル名: Lesson26_2/main.c

#include <stdio.h>

int main(void) {
    int i;

    // 5から1まで1ずつ減らして表示する
    for (i = 5; i > 0; i--) {
        printf("残り%d回です。\n", i);
    }

    printf("カウントダウンが終わりました。\n");

    return 0;
}

実行結果

残り5回です。
残り4回です。
残り3回です。
残り2回です。
残り1回です。
カウントダウンが終わりました。

このプログラムでは、iを5から始めています。条件式はi > 0なので、iが1のときまでは処理が実行されます。処理が1回終わるたびにi--によってiが1ずつ減ります。

iが0になると、i > 0が成り立たなくなるため、for文を抜けます。

for文の中でのi++とi--の役割

for文の最後に書くi++やi--は、1回の繰り返しが終わったあとに実行されます。

for (i = 5; i > 0; i--) {
    printf("残り%d回です。\n", i);
}

このfor文は、次のような順番で動きます。

手順内容
1iに5を代入する
2i > 0を判定する
3条件が真ならprintfを実行する
4i--でiを1減らす
5再びi > 0を判定する

このように、i--は繰り返しの最後に実行されます。先に減らしてから表示するわけではありません。for文の動きとセットで理解しておくと、出力結果を追いやすくなります。

図:for文でのインクリメント・デクリメント

この図から分かること

この図から分かるのは、for文では処理が終わったあとにi++やi--が実行されるということです。

i++を使うと値が1ずつ増え、i--を使うと値が1ずつ減ります。繰り返し回数を管理する変数を更新する場面では、インクリメント・デクリメントがとてもよく使われます。

1以外の増減には代入演算子を使う

インクリメントとデクリメントは、1ずつ増やす、1ずつ減らすための演算子です。

2ずつ増やしたい、3ずつ減らしたいといった場合は、+=や-=を使います。

書き方動き
i++iを1増やす
i--iを1減らす
i += 2iを2増やす
i -= 2iを2減らす
i += 3iを3増やす
i -= 3iを3減らす

for文では、次のような書き方ができます。

for (i = 0; i < 10; i += 2) {
    printf("%d\n", i);
}

この場合、iは0、2、4、6、8と変化します。

また、次のように書くと、10から2ずつ減っていきます。

for (i = 10; i > 0; i -= 2) {
    printf("%d\n", i);
}

この場合、iは10、8、6、4、2と変化します。

増減の書き方を表で整理する

繰り返し処理では、どの値から始めて、どの条件まで続けて、どのように変化するかを整理すると分かりやすくなります。

for文の例出力される値説明
for (i = 0; i < 5; i++)0 1 2 3 40から1ずつ増やす
for (i = 5; i > 0; i--)5 4 3 2 15から1ずつ減らす
for (i = 2; i <= 10; i += 2)2 4 6 8 102から2ずつ増やす
for (i = 9; i >= 3; i -= 3)9 6 39から3ずつ減らす

++と--は1ずつの増減に使います。
それ以外の幅で値を変えたい場合は、+=や-=を使うと自然です。

前置と後置は単独で使うと同じ結果になる

インクリメントやデクリメントを単独の文として使う場合、前置と後置の違いはほとんど気にしなくて大丈夫です。

i++;
++i;

どちらもiを1増やします。

i--;
--i;

どちらもiを1減らします。

そのため、for文の増分式ではi++がよく使われます。たとえば、次のような形です。

for (i = 0; i < 5; i++) {
    printf("%d\n", i);
}

この場合、i++は単独の更新処理として使われているため、前置と後置の違いを強く意識する必要はありません。

式の中で使うときは前置と後置に注意する

前置と後置の違いが重要になるのは、代入や計算式の中で使うときです。

a = x++;
b = ++y;

このような書き方では、値を使うタイミングが結果に影響します。

慣れないうちは、式の中でインクリメントやデクリメントを使いすぎないほうが読みやすくなります。特に、1つの式の中で同じ変数を何度も増減させるような書き方は避けたほうが安全です。

たとえば、次のような書き方は分かりにくく、期待どおりに読みにくいです。

result = i++ + ++i;

このような式は、学習段階では使わないようにしましょう。
値を増やす処理と計算する処理を分けて書いたほうが、読みやすくて安全です。

i++;
result = i + 10;

このように分けると、どのタイミングでiが増えるのかが明確になります。

インクリメント・デクリメントでよくある間違い

インクリメント・デクリメントは短く書ける便利な演算子ですが、使い方を間違えると分かりにくいコードになりやすいです。

よくある間違い内容
前置と後置の違いを意識しない式の中で使ったときに結果が変わる
1以外の増減に++や--を使おうとする2以上の増減には+=や-=を使う
同じ式で何度も増減する読みにくく、動きも追いにくい
ループ条件を間違える無限ループや回数不足につながる
i++の実行タイミングを誤解するfor文では処理後に実行される

特に、for文では条件式と増分式の関係に注意しましょう。

for (i = 5; i > 0; i--)

この場合、iは5から始まり、処理が終わるたびに1ずつ減ります。iが0になったら条件が偽になり、ループを終了します。

読みやすく使うためのコツ

インクリメント・デクリメントを使うときは、短く書くことだけを目的にしないことが大切です。読みやすく、意図が伝わるコードにすることを意識しましょう。

単独の更新には積極的に使う

count++;
stock--;

このような使い方は分かりやすく、よく使われます。

式の中では無理に使わない

a = x++;

このような書き方は便利な場面もありますが、前置と後置の違いを理解していないと読み間違えやすくなります。慣れるまでは、更新と代入を分けて書くのもよい方法です。

1以外の増減は代入演算子を使う

i += 2;
i -= 3;

このように書くと、2ずつ増やす、3ずつ減らすという意図がはっきりします。

for文ではループの流れと一緒に考える

for文では、i++やi--がいつ実行されるかを意識しましょう。処理のあとに実行され、再び条件判定へ戻ります。

インクリメント・デクリメントは繰り返し処理の基本になる

インクリメント・デクリメントを理解すると、C言語の繰り返し処理がかなり読みやすくなります。特にfor文では、ループ変数を1ずつ増やしたり減らしたりする場面が多いため、i++やi--は何度も登場します。

まずは、++は1増やす、--は1減らすという基本を押さえましょう。次に、前置と後置では値を使うタイミングが違うことを理解します。そして、for文の中では処理のあとにループ変数が更新されることを意識すると、繰り返しの流れがつかみやすくなります。

インクリメント・デクリメントは短い記号ですが、C言語ではとても重要です。値がいつ変わるのかを丁寧に追いながら、少しずつ使い慣れていきましょう。