Je sais que EOF
et '\0'
sont de type entier, mais si oui, ne devraient-ils pas avoir une valeur fixe?
J'ai imprimé les deux et obtenu -1 pour EOF
et 0 pour '\0'
. Mais ces valeurs sont-elles fixes?
J'ai aussi eu ça
int a=-1;
printf("%d",a==EOF); //printed 1
Les valeurs de EOF
et '\0'
entiers fixes?
EOF
est une macro qui se développe en une expression constante entière avec le type int
et une valeur négative dépendante de l'implémentation mais est très souvent -1.
'\0'
Est un char
avec la valeur 0 en C++ et un int
avec la valeur 0 en C.
La raison pour laquelle printf("%d",a==EOF);
a généré 1
Est que vous n'avez pas affecté la valeur EOF
à a
. Au lieu de cela, vous avez vérifié si a
était égal à EOF
et comme c'était vrai (a == -1 == EOF
), Il a imprimé 1
.
NULL
et '\0'
sont garantis à 0, donc (avec des transtypages appropriés) ils peuvent être considérés comme identiques en valeur; notez cependant qu'ils représentent deux choses très différentes: NULL
est un pointeur nul (toujours invalide) , tandis que '\0'
est le terminateur de chaîne. EOF
est à la place une constante entière négative qui indique la fin d'un flux; souvent c'est -1, mais la norme ne dit rien de sa valeur réelle.
C & C++ diffèrent par le type de NULL
et '\0'
:
'\0'
est un char
, tandis qu'en C c'est un int
; ceci parce qu'en C tous les littéraux de caractères sont considérés comme int
s.en C++ NULL
est "juste" un 0 intégral, tandis qu'en C il peut être défini comme un 0 transtypé en void *
; cela ne peut pas être fait en C++ (et c'est explicitement interdit dans une note) car, étant C++ plus strict dans les conversions de pointeurs, un void *
n'est pas implicitement convertible en un autre type de pointeur, donc, si NULL
était un void *
, il serait nécessaire de le convertir en type de pointeur cible lors de l'affectation:
int * ptr = (void *) 0; /* valid C, invalid C++ */
Citations standard pertinentes:
NULL
NULL
est un type entier garanti à évaluer à 0:
4.10 Conversions de pointeur
Une constante de pointeur nul est une expression constante intégrale (5.19) rvalue de type entier évaluée à zéro. Une constante de pointeur nul peut être convertie en un type de pointeur; le résultat est la valeur de pointeur nulle de ce type et se distingue de toutes les autres valeurs de pointeur sur objet ou de pointeur sur type de fonction. Deux valeurs de pointeur nul du même type doivent être égales. La conversion d'une constante de pointeur nul en un pointeur vers un type qualifié par cv est une conversion unique, et non la séquence d'une conversion de pointeur suivie d'une conversion de qualification (4.4).
18.1 Types
[...] La macro NULL est une constante de pointeur nul C++ définie par l'implémentation dans la présente Norme internationale (4.10). ( Les définitions possibles incluent
0
et0L
, mais non(void*)0
).
'\0'
Un caractère de valeur 0 doit exister:
2.2 Jeux de caractères
Le jeu de caractères d'exécution de base et le jeu de caractères d'exécution de base doivent chacun [...] contenir un caractère nul (respectivement, caractère large nul), dont la représentation a tous les bits à zéro.
'\0'
est un char
littéral:
2.13.2 Littéraux de caractères
Un littéral de caractères est un ou plusieurs caractères entre guillemets simples, comme dans
'x'
, éventuellement précédé de la lettre L, comme dans L’x ’. Un littéral de caractère qui ne commence pas par L est un littéral de caractère ordinaire, également appelé littéral de caractère étroit. Un littéral de caractère ordinaire qui contient un seul c-char a le typechar
, avec une valeur égale à la valeur numérique de l'encodage du c-char dans le jeu de caractères d'exécution.
et sa valeur est 0, car cette séquence d'échappement spécifie sa valeur:
L'évasion
\ooo
se compose de la barre oblique inverse suivie d'un, deux ou trois chiffres octaux qui sont utilisés pour spécifier la valeur du caractère souhaité.
'\0'
est utilisé pour terminer les chaînes de caractères littéraux:
2.13.4 Littéraux de chaîne
Après toute concaténation nécessaire, en phase de traduction 7 (2.1),
'\0'
est ajouté à chaque littéral de chaîne afin que les programmes qui analysent une chaîne puissent trouver sa fin.
EOF
La définition de EOF
est déléguée à la norme C89 (comme indiqué au §27.8.2 "Fichiers de bibliothèque C"), où elle est définie comme un entier négatif spécifique à l'implémentation.
NULL
Un pointeur nul est un entier 0, éventuellement converti en void *
; NULL
est un pointeur nul.
6.3.2.3 Pointeurs
[...] Une expression constante entière avec la valeur 0, ou une telle expression transtypée en type
void *
, est appelé une constante de pointeur nul. (La macroNULL
est définie dans<stddef.h>
(et autres en-têtes) comme constante de pointeur nul; voir 7.17.) Si une constante de pointeur nul est convertie en un type de pointeur, le pointeur résultant, appelé pointeur nul, est garanti de se comparer de manière inégale à un pointeur à n'importe quel objet ou fonction.7.17 Définitions communes
<stddef.h>
[...] Les macros sont
NULL
qui se développe en une constante de pointeur nul définie par l'implémentation; [...]
'\0'
'\0'
est un entier de valeur 0 et est utilisé pour terminer les chaînes:
5.2.1 Jeux de caractères
[...] Un octet avec tous les bits mis à 0, appelé le caractère nul , doit exister dans le jeu de caractères d'exécution de base; il est utilisé pour terminer une chaîne de caractères.
6.4.4.4 Constantes de caractères
Une constante de caractère entier est une séquence d'un ou plusieurs caractères multi-octets entourés de guillemets simples, comme dans
'x'
. [...]Les chiffres octaux qui suivent la barre oblique inverse dans une séquence d'échappement octale sont considérés comme faisant partie de la construction d'un seul caractère pour une constante de caractère entier ou d'un seul caractère large pour une constante de caractère large. La valeur numérique de l'entier octal ainsi formé spécifie la valeur du caractère souhaité ou du caractère large. [...]
Une constante de caractère entier a le type
int
.
EOF
EOF
est un entier négatif défini par l'implémentation
7.19 Entrée/sortie
<stdio.h>
7.19.1 Introduction
EOF
qui se développe en une expression constante entière, avec le type
int
et une valeur négative, qui est retournée par plusieurs fonctions pour indiquer la fin du fichier, c'est-à-dire, plus d'entrée d'un flux
'\ 0' est toujours le caractère nul, ou 0. EOF dépend du compilateur, mais est généralement -1, et est toujours une valeur qu'un unsigned char
ne peut pas tenir. Ne vous fiez pas à la valeur de EOF étant n'importe quoi, car il PEUT CHANGER. Faites toujours x == EOF pas x == -1. La valeur '\ 0' est TOUJOURS 0. Vous pouvez compter sur cela.
Oui, ils sont. '\0'
a la même valeur de NULL
qui est 0 (mais cela signifie des choses différentes), tandis que EOF est généralement -1.
printf("%d",a==EOF); //printed 1
Dans ce cas, vous demandez: est un == EOF? si c'est print 1 (qui est vrai), ce n'est pas print 0 (qui est faux).