C'est une histoire ancienne: elle remonte à C.
Il n'y a pas d' null
mot-clé dans C. Un pointeur null constante dans C est soit:
- intégrante expression constante avec la valeur 0, comme
0
, 0L
, '\0'
(rappelez-vous que char
est une intégrale), (2-4/2)
- une telle expression jeté à l'
void*
, comme (void*)0
, (void*)0L
, (void*)'\0'
, (void*)(2-4/2)
L' NULL
macro (pas un mot!) se développe à un tel pointeur null constante.
Dans le premier C++ conception, l'intégrale de l'expression constante été accueilli comme un pointeur null constante. Récemment std::nullptr_t
a été ajouté à C++.
En C++, mais pas en C, const
variable de type intégral initialisé avec une partie intégrante expression constante est un élément constant de l'expression:
const int c = 3;
int i;
switch(i) {
case c: // valid C++
// but invalid C!
}
Ainsi, un const char
initialisé avec l'expression '\0'
est un pointeur null constante:
int zero() { return 0; }
void foo() {
const char k0 = '\0',
k1 = 1,
c = zero();
int *pi;
pi = k0; // OK (constant expression, value 0)
pi = k1; // error (value 1)
pi = c; // error (not a constant expression)
}
Et vous pensez que ce n'est pas son langage de conception?
Mis à jour pour inclure les parties pertinentes de la norme C99...
Selon le §6.6.6...
Une constante entière expression doit avoir de type entier et n'a d'opérandes
qui sont les constantes entières, le dénombrement des constantes, des constantes de caractère, sizeof
les expressions dont les résultats sont des constantes entières, et les constantes flottantes qui sont les
immédiate des opérandes de jette. Opérateurs de Cast dans une constante entière expression ne
convertir arithmétique types de types integer, sauf dans le cadre d'un opérande de l' sizeof
de l'opérateur.
Quelques précisions pour C++-seuls les programmeurs:
- C) utilise le terme de "constante" pour que les programmeurs en C++ savoir qu'une "littérale".
- En C++,
sizeof
est toujours un moment de la compilation constante; mais C est de longueur variable, de tableaux, de sorte sizeof
est parfois pas une compilation constante de temps.
Ensuite, nous voir §6.3.2.3.3 états...
Une constante entière expression avec la valeur 0, ou une expression en fonte de type
void *
, est appelé un pointeur null constante. Si un pointeur null constante, est converti en un type pointeur le pointeur résultant, appelé un pointeur null, c'est la garantie de comparer l'inégalité à un pointeur sur un objet ou une fonction.
Pour voir juste comment vieux cette fonctionnalité, voir l'identique en miroir des pièces dans la C98 standard...
§6.6.6
Une constante entière expression doit avoir de type entier et n'a d'opérandes qui sont des constantes entières, le dénombrement des constantes, des constantes de caractère, sizeof
expressions dont les résultats sont des constantes entières, et les constantes flottantes qui sont les opérandes de jette. Opérateurs de Cast dans une constante entière expression est de convertir l'arithmétique types de types integer, sauf dans le cadre d'un opérande de l' sizeof
de l'opérateur.
§6.3.2.3.3
Une constante entière expression avec la valeur 0, ou une expression en fonte de type
void *
, est appelé un pointeur null constante. Si un pointeur null constante, est converti en un type pointeur le pointeur résultant, appelé un pointeur null, c'est la garantie de comparer l'inégalité à un pointeur sur un objet ou une fonction.