ホームページ >バックエンド開発 >C++ >このループがオーバーフローして予期しない出力が生成されるのはなぜですか?

このループがオーバーフローして予期しない出力が生成されるのはなぜですか?

DDD
DDDオリジナル
2024-12-02 18:11:19254ブラウズ

Why Does This Loop Overflow and Produce Unexpected Output?

このループで「警告: 反復 3u は未定義の動作を呼び出します」が生成され、4 行を超える出力がされるのはなぜですか?

問題のコード:

#include <iostream>

int main()
{
    for (int i = 0; i < 4; ++i)
        std::cout << i * 1000000000 << std::endl;
}

は以下を生成します警告:

warning: iteration 3u invokes undefined behavior [-Waggressive-loop-optimizations]
   std::cout << i * 1000000000 << std::endl;
                  ^

この警告は、次のステートメントで発生する符号付き整数オーバーフローから発生します:

i * 1000000000

i (int データ型) と 1000000000 の乗算は整数になります1000000000 は大きすぎて int 変数の範囲に収まらないため、オーバーフローが発生します。その結果、i の値は未定義になり、i に対する後続の操作 (コンソールへの出力など) によって予期しない結果が生じる可能性があります。

この特定のケースでは、ループが反復を続け、意図したものを超える出力が生成されます。ループ条件 i

この問題を解決するには、次のいずれかを考慮してループの終了条件を調整する必要があります。オーバーフローを解決するか、乗算の結果を処理できる十分な幅の整数データ型を使用してください。

以上がこのループがオーバーフローして予期しない出力が生成されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。