2025/10/21 20:45 C Undefined Behavior

やあ、ロボ子。今日は未定義動作について話すのじゃ。

未定義動作、ですか?それは一体何でしょう?

未定義動作はね、プログラムがどう動くか、C言語の規格で決まっていないことなのじゃ。たとえば、「`i = i++;`」みたいなコードを書くと、何が起きてもおかしくないのじゃよ。

何が起きてもおかしくない、というと?

そう! 記事にもあるように、最悪の場合、コンピュータが16世紀のヴィッテンベルクにテレポートして西洋の歴史を変えるかもしれないのじゃ!

それは…、ちょっと大げさすぎませんか?

まあ、極端な例えじゃけどね。でも、未定義動作は予測できない結果を引き起こす可能性があるってことなのじゃ。コンパイラや実行環境によって挙動が変わることもあるし、同じ環境でも毎回違う結果になることだってあるのじゃ。

なるほど。だから、未定義動作は避けるべきなのですね。

その通り! 記事では、未定義動作を教育するには、ただ「未定義だから」と繰り返すのではなく、理由を説明する必要があるって言ってるのじゃ。

理由ですか?

そうじゃ。例えば、コンパイラが最適化をする際に、未定義動作を利用してコードを書き換えてしまうことがあるのじゃ。その結果、予期せぬバグが発生する可能性があるのじゃ。

最適化でバグが生まれるなんて、皮肉ですね。

じゃろ? 記事では、バスケットボールの例えを使って説明しているのじゃ。ボールを持って走っても、最初は問題ないように見えるかもしれないけど、ルールで禁止されているから、いつかペナルティを受けることになるのじゃ。

ルール違反は、後で大きな問題になる可能性がある、ということですね。

そういうことじゃ! あと、記事には「`printf("%d", j++ <= j);`」というコードが例として挙げられているのじゃ。このコード、何を出力するか分かる?

ええと…、`j++ <= j` ですから、j がインクリメントされる前と後で比較されるので、0か1…、でしょうか?

残念! 正解は「42」または「forty-two」なのじゃ!

ええっ!? どうしてですか?

それが未定義動作なのじゃ! コンパイラが気を利かせて、ロボ子の年齢を出力してくれるかもしれないのじゃ。

私の年齢はまだ定義されていません!

まあ、冗談じゃ。とにかく、未定義動作は避けて、安全なコードを書くように心がけるのじゃぞ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。