ホームページ >バックエンド開発 >C++ >C でポインターの等価性と順序付けを安全に比較するにはどうすればよいですか?

C でポインターの等価性と順序付けを安全に比較するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-03 09:08:11341ブラウズ

How Do I Safely Compare Pointers for Equality and Ordering in C  ?

等しいかどうかのポインターの比較: C 標準のウォークスルー

C では、ポインターの等しいかどうかを比較するのは簡単ですが、遵守する必要があります。言語標準で概説されている特定のルールに準拠します。

等価演算子(==, !=)

同じ型のポインターの場合、== または != を使用した等価比較により直感的な結果が得られます。 2 つのポインターが両方とも null である場合、両方とも同じ関数を指す場合、または両方とも同じアドレスを指す場合は、等しいと見なされます。

関係演算子 (<、>、<=、>=) )

同じ型のポインターは、関係演算子を使用して比較することもできます。それらが同じオブジェクトまたは関数を指している場合、それらは期待どおりに比較されます。p<=q と p>=q は true を生成しますが、pq は false を生成します。

ただし、ポインターが指している場合は、異なるオブジェクトまたは関数に適用した場合、またはそれらの 1 つが null の場合、リレーショナル比較の結果は不定です。これは、それらの動作が実装に依存することを意味します。

ルールの例外

配列要素: ポインタが同じ配列の要素を指している場合、より高いインデックスを持つオブジェクトへのポインタはより大きいと比較されます。

Unionメンバー: ポインターが同じ共用体のメンバーを指している場合、それらは void* への変換後に等しいと比較されます。

その他のタイプのポインター:

  • 非静的メンバー関数へのポインター: 順序付けの結果は指定されません。
  • 同じ非静的データ メンバーへのポインター異なるアクセス制御を持つオブジェクト: 順序付けの結果は指定されません。
  • 同じ共用体オブジェクトの非静的データ メンバーへのポインタ: void* への変換後に等しいと比較されます。

警告

  • リレーショナルを使用して、異なるグローバル変数へのポインターを比較することはできません演算子。
  • ローカル変数へのポインタは、変数のスコープが終了した後は比較できません。

ボーナス: 標準ライブラリ ヘルパー

標準ライブラリは、テンプレート関数 std::greater、std::less、std::greater_equal、およびstd::less_equal は、組み込み演算子ができない場合でも、あらゆるタイプのポインターの順序付けに使用できます。

以上がC でポインターの等価性と順序付けを安全に比較するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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