ホームページ  >  記事  >  バックエンド開発  >  C の初期化されていない変数が一見ランダムな値を出力するのはなぜですか?

C の初期化されていない変数が一見ランダムな値を出力するのはなぜですか?

DDD
DDDオリジナル
2024-11-09 08:29:02404ブラウズ

Why do uninitialized variables in C   print seemingly random values?

初期化されていない変数の謎に迫る: 奇妙な値が出現する理由

コーディングの領域では、初期化されていない変数が複雑な結果を引き起こす可能性があります。そのような謎の 1 つは、このような変数を出力しようとすると発生し、謎の数値出力につながります。

この謎を解明するために、提供されている C コードを調べてみましょう。

int var;
cout << var << endl;

これは、整数変数 var を宣言しています。初期値なし。 var を出力すると、2514932 のような任意の数値が返されます。これは、初期値のない変数には、メモリに格納されたランダムなビットを表すガベージ データが保持されるためです。

同様に、初期化されていない double 変数 var を出力すると、同様に予期しない値が返されます。 1.23769e-307 のような値が現れる可能性があります。これも、その初期内容が未定義であることから生じています。

未定義の動作の危険性

根本的な問題は、「未定義の動作」の概念にあります。 C では、初期化されていない変数にアクセスするとこのルールに違反し、予測できない結果が生じます。コンパイラにはそのような状況を適切に処理する義務はなく、本質的には「あなたの望むようにしてください。私は責任を負いません。」と言うのです。

実際の結果

これを実際の例で説明します。

#include <iostream>

const char* test()
{
    bool b; // uninitialized

    switch (b) // undefined behavior!
    {
    case false:
        return "false";      // garbage was zero (zero is false)
    case true:
        return "true";       // garbage was non-zero (non-zero is true)
    default:
        return "impossible"; // options are exhausted, this must be impossible...
    }
}

int main()
{
    std::cout << test() << std::endl;
}

直感的には、真の値と偽の値の両方のオプションがカバーされているため、関数テストが「不可能」を返すことはないと予想されるかもしれません。ただし、未定義の動作は不可能を可能にする可能性があります。 g -02 を使用してコードをコンパイルすると、この現象が発生する可能性があります。

結論

初期化されていない変数に関連する予期しない動作を回避するには、変数を適切な値で初期化することが不可欠です。 。この簡単な方法により、コードが未定義の動作という曖昧な領域に踏み込むことがなくなり、プログラムが意図したとおりに機能し続けることが保証されます。

以上がC の初期化されていない変数が一見ランダムな値を出力するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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