読者です 読者をやめる 読者になる 読者になる

++の副作用タイミング

プログラミングの世界で「副作用」というと、関数や演算が状態を変化させることを言います。
例えば単純代入演算子の「=」は副作用のある演算子。「a=5;」という演算をすると変数aの値が変化します。この変化のことを「副作用」と呼ぶわけです。
でも副作用の発生する順番、つまり値の書き換えの起こる順番が言語仕様として規定されていないことがあります。すると、コンパイラによってプログラムの実行結果が全然違ってしまうことがある。
今日学生のレポートを採点していて、こんなことがありました。
全然動かないプログラムを提出してきた学生に「動きませんよ」と突っ返したところ、「いえ動きますよ」とまた出してきたのです。
ソースをみたらこんな記述がありました。

 t = t++;

++の使い方をよく知らなくて、t=t+1; と t++; を混同してしまったらしい。
この文には、副作用のある演算が二つ含まれています。代入「=」とインクリメント「++」。このどちらが先に起こるかがコンパイラによって違うのです。
まず代入が起こって、それからインクリメントが起こるなら、tは1つずつ増えていきます。その逆だと、tはいつまでたっても増えない。そういうカラクリでした。
まあ、こんな初歩的な混同は仕方ないとしても、++演算子を使うときは意味の未定義な記述をしてしまわないよう注意しないといけませんね。