★インクリメント、デクリメント★


インクリメント演算子とデクリメント演算子は単項演算子の1つです。

インクリメント演算子は ++ と書き、変数の中身を1だけ増やします。

デクリメント演算子は -- と書き、変数の中身を1だけ減らします。

例を書きます。


<sample program col012-01>

#include <stdio.h>

int main(void)
{
    int data;

    data = 0;

    data++;

    printf("data = %d\n", data);

    return 0;
}

<実行結果>

data = 1
続行するには何かキーを押してください・・・

<sample program col012-02>

#include <stdio.h>

int main(void)
{
    int data;

    data = 0;

    data--;

    printf("data = %d\n", data);

    return 0;
}

<実行結果>

data = -1
続行するには何かキーを押してください・・・

上の2つの例で、変数dataの中身が1増えたり、減ったりしていることが確認できます。

これらのプログラムは次のように書くこともできます。


<sample program col012-03>

#include <stdio.h>

int main(void)
{
    int data;

    data = 0;

    ++data;

    printf("data = %d\n", data);

    return 0;
}

<実行結果>

data = 1
続行するには何かキーを押してください・・・

<sample program col012-04>

#include <stdio.h>

int main(void)
{
    int data;

    data = 0;

    --data;

    printf("data = %d\n", data);

    return 0;
}

<実行結果>

data = -1
続行するには何かキーを押してください・・・

++ や -- を変数の後ろに書いても、前に書いても同じように動作しています。

では、違いは全く無いのか? というとあるのです。

次のインクリメントを使ったプログラムを実行して結果を見てください。


<sample program col012-05>

#include <stdio.h>

int main(void)
{
    int data;

    data = 0;

    printf("data = %d\n", data++);

    return 0;
}

<実行結果>

data = 0
続行するには何かキーを押してください・・・

printfの中でインクリメントを使っています。

しかし、実行結果は0です・・・

1増えているはずなのに、0が表示されています。

念のため、もう一度表示してみます。


<sample program col012-06>

#include <stdio.h>

int main(void)
{
    int data;

    data = 0;

    printf("data = %d\n", data++);

    printf("data = %d\n", data);

    return 0;
}

<実行結果>

data = 0
data = 1
続行するには何かキーを押してください・・・

1回目のprintfの時は0ですが、2回目のprintfの時にはきちんと1が表示されています。

※2回目はインクリメントを使わず、単純に中身を表示していることを確認しておいてください。

理由は後で説明しますので、次の例と比べてみてください。


<sample program col012-07>

#include <stdio.h>

int main(void)
{
    int data;

    data = 0;

    printf("data = %d\n", ++data);

    return 0;
}

<実行結果>

data = 1
続行するには何かキーを押してください・・・

変数dataの前に ++ を付けると普通に1と表示されました。

念のため、2回目の表示をしてみます。


<sample program col012-08>

#include <stdio.h>

int main(void)
{
    int data;

    data = 0;

    printf("data = %d\n", ++data);

    printf("data = %d\n", data);

    return 0;
}

<実行結果>

data = 1
data = 1
続行するには何かキーを押してください・・・

2回目に表示しても、同じ1のままです。

++ を変数の前に付けるのと後ろに付けるのと何が違うのでしょうか。

実は、次のような違いがあります。

  data++ 〜の後で1増やす (後置インクリメント)

  ++data 〜の前に1増やす (前置インクリメント)

ですから、上の例では、

  printfで表示した後で1増やす data++

  printfで表示する前に1増やす ++data

という違いがあった訳です。


<col012-01>から<col012-04>までのように単独で使う場合の違いはありませんが、<col012-05>から<col012-08>のように他の命令と組み合わせて使う場合は注意が必要です。

というよりは、理解しやすくするために、なるべく他の命令と一緒に使わない方が無難と言えます。


余談ですが、あるC言語の検定試験では、次のような問題が出ます。


<sample program col012-09>

#include <stdio.h>

int main(void)
{
    int a = 3;
    int b = 5;
    int c;

    c = a++ * --b;

    printf("c = %d\n", c);

    return 0;
}

問.このプログラムの実行結果を書きなさい。


ペーパーテストですから、実際に実行することは出来ません。

頭で考えるしかないのですが、答えは12です。

aには3が入っています。

bには5が入っています。

aは後ろに++とありますから、掛け算の後で1増えます。

bは前に--とありますから、掛け算の前に1減ります。

つまり、掛け算はaが3、bが4として計算されるわけです。

当然、掛け算が終わり、結果がcに代入された後にaは1増えます。


「へーそうなんだ!今度から使ってみよう!」と思われた方は注意してください。

「何だかややこしいな」と思われた方は良い反応だと思います。

C言語ではこのような書き方も出来るのですが、分かりにくい書き方だと思います。

例えば、同じことをするのに、下のような書き方であればどうでしょう。


<sample program col012-10>

#include <stdio.h>

int main(void)
{
    int a = 3;
    int b = 5;
    int c;

    b--;

    c = a * b;

    a++;

    printf("c = %d\n", c);

    return 0;
}

ぱっと見て、先にbが1減り、掛け算を行った後で、aが1増えているのが分かります。

プログラムは分かりにくく書こうと思えばいくらでも分かりにくく書けます。

しかし、プログラムは「他のプログラマも見る」ことを前提に書かなければなりません。

インデント」の説明にも書きましたが、分かりやすく書くということは非常に重要です。

ぱっと見て分かりにくいプログラムは、後々自分や他人が苦労します。

正直な話、どれだけの人が「前置」と「後置」の意味の違いを理解しているかも分かりません。

分かりやすい書き方が出来るのであれば、そちらを選択するべきだと思います。

検定試験は知識を問うものなので仕方ない部分もあるのですが、こういった試験を受験する方が勘違いをしなければいいな、と思っています。


ブラウザの戻るボタンで戻ってください。