50で実行がストップしないかが分かりません。コンパイラ依存なようです。(experimental))では再現しません。ご回答の程、よろしくお願いします。確かに符号付き整数のオーバーフローは未定義動作ですが...具体的にどうしてこうなるのかはgccのコードを読まないとわからないかもしれません。__cxa_atexit確かに無限ループになっているようである。ret最適化をしない場合は、きちんとループ継続の判定をしている。"このclangでは、最適化を有効にしてもループの終了が判定されている。(experimental)でも最適化を有効にすると再現しました。2年前とても面白い問題ですね。みけCATさんの指摘通り、符号付き整数がオーバーフローした時の動作は未定義です。最近のコンパイラは、未定義動作に対してとんでもない最適化をします。オーバーフローしますので、未定義動作になります。なることは決して無いものとみなすことができます。なることも決してありません。削除することができます。その結果、無限ループになります。未定義動作がいかにとんでもない結果を引き起こすかは、以下の記事が面白いです。返信が遅れてしまい、申し訳ありません。みけCATさんありがとうございます。コンパイラと最適化オプションの組によって、動作が変化するということが、出力されたアセンブリによってよく分かりました。符号付き整数のオーバーフローは動作未定義であるため、このような現象が起こるのですね。Explorerというサイト、非常に便利ですね。これからも活用させていただきます。0;とすると、(期待通り)ループが終了しました。Explorerを使って、アセンブリを調べてみると、どうやらiの値ではなく、vの値でループを終了するかどうかを判定しているようです。符号なし整数のオーバーフローは規格で定義されており、最終的なvの値を予め計算できる(かつ等値判定の方が処理が早い)ため、埋め込みを行っているのではないか、と考察しました。結城紬さんありがとうございます。処理系が何を目的にこのような最適化を行っているのかがよく分かり、とてもスッキリしました。紹介されたリンクも参考にしていろいろと考察した結果、C++のコンパイラの気持ちが多少分かるようになった気がします。false;}のiが5の場合は、決して発生しない。iが5に到達するには、iはまず、4に到達しなければならない。吾輩は、すでにiが4には到達しないと看過しておるからだ。故に、すべての合法なコードパスはtrueを返すものである。間の説明が飛んでいるように思われたため、考察してみました。最適化する他の例も興味深く、現在考察を進めているところです。非常にためになっています。ありがとうございます。以上をもって、このトピックは解決とさせていただきます。結城紬さん、ありがとうございました。ミクプラは自由にリンクできます。