[解決済み] 整数オーバーフローが未定義の動作になるのはループのどの時点か?
質問
これは私の質問を説明するための例で、ここには載せられないもっと複雑なコードを含んでいます。
#include <stdio.h>
int main()
{
int a = 0;
for (int i = 0; i < 3; i++)
{
printf("Hello\n");
a = a + 1000000000;
}
}
このプログラムは、私のプラットフォームでは未定義の動作を含んでいます。
a
が3回目のループでオーバーフローするからです。
これで
プログラム全体
が未定義の挙動をするのか、それとも
オーバーフローが実際に発生した後でのみ
? コンパイラは潜在的に
a
となります。
はオーバーフローするので、ループ全体を未定義と宣言し、printfsがすべてオーバーフローの前に発生するにもかかわらず、わざわざ実行する必要はないのでしょうか?
(それらが異なっている場合、両方の言語のための答えに興味があるので、異なっていてもCとC++をタグ付けしました)。
どのように解決するのですか?
純粋に理論的な答えに興味があるなら、C++ 標準は "タイムトラベル" に未定義の動作を許可しています。
[intro.execution]/5:
整形式のプログラムを実行する適合する実装は,同じプログラムをもつ対応する抽象機械の実行可能な1つと同じ観測可能な振る舞いを生成しなければならない 抽象機械の対応するインスタンスが,同じプログラム,同じ入力で実行される可能性のあるものと と同じ入力で,抽象機械の対応するインスタンスの可能な実行の一つと同じ観察可能な振る舞いを生成しなければならない。しかし そのような実行が未定義の操作を含んでいる場合,この国際規格は,実行する実装に何も要求しない。 規格は、そのプログラムをその入力で実行する実装に何の要件も課さない(最初の未定義操作に先立つ操作に関しても同様)。
このように、もしあなたのプログラムが未定義の動作を含んでいるならば、あなたの プログラム全体 は未定義です。
関連
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】Enterキーを押して続行する
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】'std::cout'への未定義の参照
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み】f(i = -1, i = -1)の挙動が未定義なのはなぜ?
-
[解決済み】符号なし整数のオーバーフローは定義されているのに、符号あり整数のオーバーフローは定義されていないのはなぜですか?
-
[解決済み] C++0xで "while(1); "を排除する最適化
-
[解決済み] C/C++の符号付きオーバーフローを検出する
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み] 動作が未定義のブランチは到達不可能とみなし、デッドコードとして最適化することができますか?