インクリメント演算子、デクリメント演算子は、アセンブラ(昔の記憶。この10年間触ったこともなかったけど)のINC, DECとかの命令に対応しているので、C言語にも取り入れられている。

基本的なところは、前置、後置という形で、それぞれ2種類の書き方がある。

  ++i  ← 前置インクリメント演算子
  i++  ← 後置インクリメント演算子
  –i  ← 前置デクリメント演算子
  i–  ← 後置デクリメント演算子

  前置 ⇒ 1 を加算してから、変数 i を評価
  後置 ⇒ 変数 i を評価してから 1を加算

この副作用によって、場合によっては混乱したりする。また事実、仕様では定義されていないケースもある。例えば、

  a[i] = ++i;
  a[i] = i--;
  a[++i] = ++i;
  a[++i] = i++;
  a[i++] = ++i;
  a[i++] = i++;

の違いや計算結果は予測できるだろうか。

自分の知識を誇示し、こういう難しいものを持ち出して解説したりするひとがいるようだが、いくつかのケースでは実は未定義となっていることはご存知だろうか。コンパイラによって全然結果が変わるし。

C言語のつくられた当初と違って、スピードもメモリも、インクリメント・デクリメント演算子を必要とする時代ではなくなっている。だから、混乱するときには正直に
 
 i = i + 1
 i = i – 1

でいこう。暇あれば、コンテスト問題でも解いてみたら。

Comments are closed.

Post Navigation