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);
あえて、インクリメント演算子を後に書きました。先ほどから言っているように、変数単独でのインクリメント演算子は、見やすいプログラムになるため、活用するといいと思います。他の演算子と合わせるのはやめておいたほうが無難です。
まとめ
インクリメント演算子(++)、デクリメント演算子(–)のお話をしました。
簡単ですが、間違って使用すると、意図しない動作になってしまうので注意が必要です。
プログラムは処理順が決まっているので、それをわかりにくくするプログラムを書くのはやめましょう。
インクリメント演算子(++)、デクリメント演算子(–)を使用するのは、変数単独での増加、減少のときだけに留めておいたほうがいいでしょう。