インクリメント恐怖症 | CABINの砦

インクリメント恐怖症

学校で課題に取り組んでいたときのこと。
友人Aが「これ何すか」とC言語のプログラム実行結果を見せてきました。
簡単な形でそのソースコードを記述すると、

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

それでびっくりした実行結果が

k = 3 k++ = 2

というものでした。
これが

k = 2 k++ = 2

だったら別段気に留めなかったかもしれません。
1時間近く「どうしてだ?何でだ?」と悩んでいたが理解できず。
自宅に戻って調べた結果、こういった動作はC規格で未定義なため意味不明の振る舞いをするとのこと。
たとえば

k = 1;
printf("%d%d%d", k++, k++, k++);

というソースコードをコンパイルして実行すると、人の環境によっては

Aさんの環境 : 123
Bさんの環境 : 321
Cさんの環境 : 111

といったように、ばらばらな結果になってしまうわけです。
「なぜ未定義なのか?どうしてこうなってしまうのか?」を詳しく知りたい方は「副作用完了点」で検索してみてください。

インクリメントこわっ!
うかつに
a++ + a + a--
とか
s[i++] + s[i]
などの式にしてしまわないよう、これから注意せねば。
(とはいえ、こんな見づらい式を書くことはないと思いますが・・・。)
もし友人が尋ねてこなかったら、規格での未定義・不定について一生触れなかったかもしれません。
あぶなっ。