Maison >développement back-end >C++ >Comment comparer en toute sécurité les pointeurs d'égalité et d'ordre en C ?

Comment comparer en toute sécurité les pointeurs d'égalité et d'ordre en C ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-03 09:08:11279parcourir

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

Comparaison des pointeurs pour l'égalité : présentation pas à pas de la norme C

En C, comparer les pointeurs pour l'égalité peut être simple, mais cela nécessite le respect à des règles spécifiques décrites dans la norme linguistique.

Opérateur d'égalité (==, !=)

Pour les pointeurs du même type, la comparaison d'égalité à l'aide de == ou != donne des résultats intuitifs. Deux pointeurs sont égaux s'ils sont tous deux nuls, tous deux pointent vers la même fonction ou tous deux pointent vers la même adresse.

Opérateurs relationnels (<, >, <=, >= )

Les pointeurs du même type peuvent également être comparés à l'aide d'opérateurs relationnels. S'ils pointent vers le même objet ou la même fonction, ils se comparent comme prévu : p<=q et p>=q donnent vrai, tandis que pq donnent faux.

Cependant, si les pointeurs pointent à différents objets ou fonctions, ou si l'un d'eux est nul, les résultats des comparaisons relationnelles ne sont pas spécifiés. Cela signifie que leur comportement dépend de l'implémentation.

Exceptions à la règle

Éléments du tableau : Si les pointeurs pointent vers des éléments du même tableau , le pointeur vers l'objet avec un indice plus élevé se compare à un plus grand.

Membres de l'Union : Si les pointeurs pointent aux membres du même syndicat, ils se comparent égaux après conversion en void*.

Autres types de pointeurs :

  • Pointeurs vers des fonctions membres non statiques : Le résultat du classement n'est pas spécifié.
  • Pointeurs vers des données membres non statiques du même objet avec un contrôle d'accès différent : le résultat du classement est non spécifié.
  • Pointeurs vers des données membres non statiques du même objet union : ils se comparent égaux après conversion à void*.

Avertissements

  • Les pointeurs vers différentes variables globales ne peuvent pas être comparés à l'aide d'opérateurs relationnels.
  • Les pointeurs vers des variables locales ne peuvent pas être comparés après la la portée de la variable est terminée.

Bonus : Standard Library Helper

La bibliothèque standard fournit les fonctions de modèle std::greater, std::less, std::greater_equal et std::less_equal, qui peuvent être utilisés pour commander n'importe quel type de pointeur, même lorsque les opérateurs intégrés ne le peuvent pas.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn