多くの人は、Null ポインターを使用して静的クラス メンバーにアクセスしてもランタイムが発生しないことに直感に反すると感じるかもしれません。エラー。この記事では、この動作を説明するために技術的な詳細を掘り下げ、潜在的な落とし穴について説明します。
議論の中心となるのは、Null ポインター逆参照の評価です。初期化されていないポインターを介してクラス メンバーにアクセスすることは一般に未定義ですが、静的メンバーは例外です。静的メンバーにアクセスする場合、オブジェクト式 (例: d->a) は (*d).a と本質的に同等です。
この場合、静的メンバー関数 fun の引数は d で、評価されますが破棄されます。これは、操作 *d が破棄された値式であるためです。つまり、副作用 (この場合は何もありません) についてのみ評価されます。
問題の核心null ポインターを介した間接指定が本質的に未定義の動作を引き起こすかどうかを中心に展開します。 C 標準は、この問題に関していくぶん矛盾したガイダンスを提供しています。ただし、広く受け入れられている解釈では、それ以上の左辺値から右辺値への変換やその他の操作を行わずに、NULL ポインターを介した単なる間接指定では、未定義の動作は呼び出されません。
CWG 問題 #232 のコンテキストで、null ポインター逆参照の問題に対処するために、「空の左辺値」の概念が提案されました。ただし、これは採用されませんでした。
サンプル コードをエラーなしで実行できる根拠は、null ポインターを使用して静的メンバー関数を呼び出す場合には ID が必要ないということです。またはオブジェクトの保存された値。静的メンバーの値には、それ以上の左辺値操作を行わずに、単純にアクセスされます。
null ポインターを使用して静的メンバーにアクセスすることは一般に許可されていますが、 の使用を避けることが重要です。演算子を使用して非静的メンバーにアクセスします。非静的メンバーのアクセスにはオブジェクトが有効である必要があるため、null ポインターを使用すると未定義の動作が発生する可能性があります。
以上がNull ポインターを使用した静的クラス メンバーへのアクセスが機能するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。