Selon le C spéc.:
Une constante entière expression avec la valeur 0, ou une expression
fonte de type void *, est appelé un pointeur null constante. 55) Si une valeur null
pointeur constant est converti en un type pointeur, la
pointeur, appelé un pointeur null, c'est la garantie de comparer l'inégalité à une
pointeur vers un objet ou une fonction.
Donc, 0
est un pointeur null constante. Et si nous le convertir en un type pointeur, nous allons obtenir un pointeur null qui peut être non-tous les bits à zéro pour certaines architectures. Ensuite nous allons voir ce que la spec dit à propos de la comparaison de pointeurs et d'un pointeur null constante:
Si l'un des opérandes est un
pointeur et l'autre est un pointeur null constante, le pointeur null
constant est convertie dans le type de l'indicateur.
Considérons (p == 0)
: premier 0
, est converti en un pointeur null, et puis, p
est comparé avec un pointeur null constante dont la valeur des bits sont dépendants de l'architecture.
Ensuite, voir ce que la spec dit à propos de l'opérateur de négation:
Le résultat de la négation logique de l'opérateur ! est 0 si la valeur de ses
opérande compare inégale à 0, 1 si la valeur de son opérande compare
égal à 0. Le résultat est de type int. L'expression !E est équivalent
(0==E).
Cela signifie qu' (!p)
est équivalent à (p == 0)
qui est, selon la spécification, test p
contre la machine défini pointeur null constante.
Ainsi, vous pouvez écrire en toute sécurité if (!p)
même sur les architectures où le pointeur null constante n'est pas tous les bits à zéro.
Comme pour le C++, un pointeur null constante est définie comme:
Un pointeur null constante est une partie intégrante expression constante (5.19)
prvalue de type entier qui prend la valeur zéro ou un prvalue de type
std::nullptr_t. Un pointeur null constante peut être converti en un pointeur
type; le résultat est la valeur de pointeur null de ce type et est
à distinguer de tous les autres de la valeur de pointeur d'objet ou de la fonction
type de pointeur.
Ce qui est proche de ce que nous avons pour le C, plus l' nullptr
de la syntaxe de sucre. Le comportement de l'opérateur ==
est défini par:
En outre, les pointeurs, les membres peuvent être comparés, ou un pointeur vers
membre et d'un pointeur null constante. Pointeur sur membre des conversions
(4.11) et de la qualification des conversions (4.4) sont effectuées afin de leur apporter
pour un type commun. Si l'un des opérandes est un pointeur null constante, l'
type le plus commun est le type de l'autre opérande. Sinon, la commune
le type est un pointeur de type de membre similaires (4.4) le type de l'un des
les opérandes, avec un cv-qualification signature (4.4) qui est le
de l'union de la cv-qualification des signatures de l'opérande types. [ Note:
ceci implique que toute pointeur de membre ne peut être comparé à une valeur null
pointeur constant. - la note de fin ]
Qui mène à la conversion de 0
pour un type de pointeur (comme en C). Pour l'opérateur de négation:
Le résultat de la négation logique de l'opérateur ! est 0 si la valeur de ses
opérande compare inégale à 0, 1 si la valeur de son opérande compare
égal à 0. Le résultat est de type int. L'expression !E est équivalent
(0==E).
Donc, if (!p)
est sans danger pour C++.
Un autre cas pourrait être if (p)
, mais c'est OK aussi, depuis le C++ spec dit qu'une valeur de pointeur null seront convertis en bool
comme false
:
Une valeur de zéro, la valeur de pointeur null, ou null membre de la valeur du pointeur est
converti à faux;