[解決済み] オンラインIDEでプログラムの挙動がおかしい件
質問
以下のようなC++プログラム( ソース ):
#include <iostream>
int main()
{
for (int i = 0; i < 300; i++)
std::cout << i << " " << i * 12345678 << std::endl;
}
これは単純なプログラムのようで、私のローカルマシンでは正しい出力、つまり次のようなものが得られます。
0 0
1 12345678
2 24691356
...
297 -628300930
298 -615955252
299 -603609574
しかし、オンライン IDE のような コーデック のようなオンライン IDE では、次のような出力が得られます。
0 0
1 12345678
2 24691356
...
4167 -95167326
4168 -82821648
4169 -7047597
なぜ
for
ループが 300 で終了するのはなぜですか?また、このプログラムは常に
4169
. なぜ
4169
であり、他の値ではないのでしょうか?
どのように解決するのですか?
私はオンラインコンパイラがGCCまたは互換性のあるコンパイラを使用していると仮定しています。もちろん、他のコンパイラも同じ最適化を行うことができますが、GCCのドキュメントでは、それが何を行うかをよく説明しています。
-faggressive-loop-optimizations
このオプションは、ループの反復回数の境界を導き出すために言語制約を使用するようループオプティマイザーに指示します。これは、ループコードが符号付き整数のオーバーフローやアウトオブバウンドの配列アクセスなど、未定義の動作を引き起こさないことを前提としています。ループの反復回数の境界は、ループのアンロールとピーリング、およびループ終了テストの最適化のガイドとして使用されます。このオプションはデフォルトで有効になっています。
このオプションは、単に UB が証明されたケースに基づく仮定を行うことを可能にするだけです。これらの仮定を利用するために、定数折りたたみなど、他の最適化を有効にする必要があるかもしれません。
符号付き整数のオーバーフローは未定義の動作をします。オプティマイザは、任意の値の
i
が 173 より大きい場合は UB が発生することを証明し、UB が発生しないと仮定できるため、オプティマイザはまた
i
が173より大きくなることはないと仮定できます。そして、さらに次のことを証明することができます。
i < 300
が常に真であることをさらに証明できるので、ループ条件を最適化することができます。
なぜ他の値ではなく、4169なのでしょうか?
これらのサイトはおそらく、表示する出力行数(または文字数やバイト数)を制限しており、たまたま同じ制限を共有しているのでしょう。
関連
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】'cout'は型名ではない
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み] 8192個の要素にループをかけると、プログラムが遅くなるのはなぜですか?
-
[解決済み] プログラムがクラッシュしたときにスタックトレースを自動的に生成する方法
-
[解決済み] C++の規格では、初期化されていないboolがプログラムをクラッシュさせることは可能ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】構造体のベクター初期化について
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】Enterキーを押して続行する
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む
-
[解決済み] なぜこのループは「warning: iteration 3u invokes undefined behavior」を生成し、4行以上出力するのでしょうか?
-
[解決済み] なぜGCCでx86の整数オーバーフローは無限ループを引き起こすのですか?