ホームページ > バックエンド開発 > C++ > `int x = x 1;` が C/C で機能するのはなぜですか?

`int x = x 1;` が C/C で機能するのはなぜですか?

DDD
リリース: 2024-11-04 11:48:02
オリジナル
371 人が閲覧しました

Why Does `int x = x   1;` Work in C/C  ?

C/C での変数の宣言的初期化 : 驚くべき動作

C/C のよく知られた宣言および初期化構文を使用して、次の初期化を行うことができます。変数は宣言時に使用されます。ただし、初期化対象の変数が初期化式自体に出現する場合、特有の動作が発生します。次のコード スニペットを考えてみましょう。

<code class="cpp">int x = x + 1;</code>
ログイン後にコピー

このコードは正常にコンパイルされ、驚くべきことに、実行後に x の値が 1 になります。変数 x は初期化で使用される前に宣言されていないように見えるため、この動作は直観に反しているように見えるかもしれません。

説明: 宣言のポイントと未定義の動作

C では、変数の宣言ポイントは、完全な宣言子 (変数の型と名前) の直後で、初期化子 (存在する場合) の前にあります。したがって、上記のコードでは、等号の位置に x が存在し、それを右側で使用できるようになります。

ただし、変数が静的ストレージ期間で初期化されていない場合に注意することが重要です。 (関数の外側など)、動作は未定義です。これは、初期化前に存在する x が任意の値を持つためです。

C 03 標準では、質問の例のように、独自の (不定の) 値で初期化された変数の動作が指定されています。は未定義です:

int x = x; // Example from the C++03 standard
{
    int x = x; // Undefined behavior
}
ログイン後にコピー

実際的な意味

この動作は驚くべきかもしれませんが、運用コードでの利用を避けることが重要です。変数が静的ストレージ期間で宣言されていない限り、未定義の動作により予期しない結果やエラーが発生する可能性があります。

ただし、この動作を理解することは、新しく宣言された変数を含む複雑な式を理解する場合や、型破りな初期化を伴うコードを分析する場合に役立つことがわかります。テクニック。

以上が`int x = x 1;` が C/C で機能するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート