C言語 インクリメント演算子(++)、デクリメント演算子(–)を使うとき注意点

  • このエントリーをはてなブックマークに追加
Pocket

C言語で値を増加したり、減少させたりすることはよくあります。

そのときに使うのが、インクリメント演算子(++)、デクリメント演算子(–)です。

1だけ増加、減少させるときの表記として、便利なのですが、記述の仕方で処理が違ってしまうので、注意が必要です。

インクリメント演算子(++)、デクリメント演算子(–)の使い方

インクリメント演算子(++)、デクリメント演算子(–)を使うときは、ある値を1だけ増加または減少させたいときです。

a++;
a--;
++a;
--a;

という風に記述します。これは、

a = a + 1;
a = a - 1;

と同じ意味です。

単独で、値を1だけ増減させるときは、インクリメント演算子(++)、デクリメント演算子(–)をつけるのが、変数の前でも後ろでも構いません。

しかし、ほかの演算子と組み合わせるときは注意が必要です。

変数aに対して、a++(a–)と++a(–a)は意味が異なる

先ほど、お話ししたように、単独で変数の増減を行うだけなら、インクリメント演算子(++)、デクリメント演算子(–)を記述する位置は、変数の前でも後でもいいとお話ししました。

しかし、他の演算子と組み合わせるのなら、話は別です。

例えば、

int a = 10;
int b = 10;

if (b == a++) {
    printf("こっちの処理を実行\n");
} else
    printf("こっちは通らない\n";
}

if (b == ++a) {
    printf("こっちは通らない\n";
} else
    printf("こっちの処理を実行\n");
}

と記述したら、「b == a++」はbとaの値を比較してから、aを1増加するということなので、if文の条件は真になります。

一方、「b == ++a」はaの値を1増加してから、bとaの値を比較するので、if文の条件は偽となります。

通常、あまりこういう書き方はしないかもしれませんが、インクリメント演算子(++)、デクリメント演算子(–)が先に来るか、後に来るかで大きな違いになってしまうので、注意しましょう。

ポインタとインクリメント演算子(++)、デクリメント演算子(–)を一緒に書くのは要注意

先ほどの比較と同様、ポインタとインクリメント演算子(++)、デクリメント演算子(–)を組み合わせるときも、同じように注意が必要です。

int a[2] = {10, 20};
int b;
int c;
int* pt;

pt = a;
b = *pt++;

pt = a;
c = *++pt;

printf(b = %d, c = %d", b, c);

とした場合、b = 10, c = 20となります。

先ほどと同様、bにポインタ変数ptが指し示しているアドレスの値を代入してから、ポインタ変数を増加しているため、bには配列a[0]の値10が入ります。

一方、cにはポインタ変数ptが指し示しているアドレスをインクリメントしてから、そのアドレスの指示している値を代入しているため、cには配列a[1]の値20が入ります。

++や–はうまく使えば、見やすいプログラムを書けますが、乱用すると、読みにくいプログラムになってしまうので注意しましょう。

先ほどの例を、わかりやすく書くとこうなります。

int a[2] = {10, 20};
int b;
int c;
int* pt;

pt = a;
b = *pt;
pt++;

pt = a;
pt++;
c = *pt;

printf(b = %d, c = %d", b, c);

あえて、インクリメント演算子を後に書きました。先ほどから言っているように、変数単独でのインクリメント演算子は、見やすいプログラムになるため、活用するといいと思います。他の演算子と合わせるのはやめておいたほうが無難です。

まとめ

インクリメント演算子(++)、デクリメント演算子(–)のお話をしました。

簡単ですが、間違って使用すると、意図しない動作になってしまうので注意が必要です。

プログラムは処理順が決まっているので、それをわかりにくくするプログラムを書くのはやめましょう。

インクリメント演算子(++)、デクリメント演算子(–)を使用するのは、変数単独での増加、減少のときだけに留めておいたほうがいいでしょう。

  • このエントリーをはてなブックマークに追加

コメントを残す

*