独自の初期化子として使用される初期化されていない変数は、プログラミングにおいて興味深い動作を示します。コンパイラからのエラーや警告を予期するのは直感的に思えるかもしれませんが、この動作は驚くほど許可されています。
C/C 標準によれば、初期化されていない変数は不定の値を持ちます。この値は、不定値またはトラップ表現として現れる可能性があります。
実装が整数型のパディング ビットをサポートしており、不定値がトラップ表現である場合、それを使用すると未定義の動作が発生します。ただし、パディング ビットがない場合、値は未指定のままであり、未定義の動作は発生しません。
レジスタ変数を考慮すると、動作はさらに複雑になります。 C11 標準で説明されているように、初期化されていない変数をイニシャライザとして使用すると、その変数のアドレスが一度も取得されていない場合、未定義の動作が発生します。
これは、初期化される前に変数のアドレスにアクセスすると、動作が不安定になることを意味します。は明確に定義されています。それ以外の場合は、未定義のままです。
コンパイラの動作の不一致は、この条件付きの未定義の動作が原因である可能性があります。 -Wall フラグを指定しないと、コンパイラーは問題について明示的に警告しない可能性があります。ただし、-Wall を使用すると、変数自体の初期化内で使用すると、変数が初期化されていないという警告が生成される可能性があります。
この動作は技術的には許可されている可能性がありますが、一般的には推奨されません。それに頼ること。初期化されていない変数を独自の初期化子として使用すると、予測できない結果や潜在的なエラーが発生する可能性があります。ベスト プラクティスでは、変数は宣言時に常に明示的に初期化する必要があります。
以上がC/C では、初期化されていない変数を独自のイニシャライザとして使用できるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。