Quelle est la valeur de EOF et " " dans C
je sais que EOF
et ''
sont de type entiers, mais ne devraient-ils pas avoir une valeur fixe?
j'ai imprimé les deux et a obtenu -1 EOF
et 0 ''
. Mais ces valeurs sont-elles fixes?
j'ai aussi eu ce
int a=-1;
printf("%d",a==EOF); //printed 1
est la valeur de EOF
et ''
nombres entiers fixes?
5 réponses
EOF
est une macro qui passe à 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.
''
est un char
avec la valeur 0 en C++ et un int
avec la valeur 0 en C.
pourquoi printf("%d",a==EOF);
résultait en 1
était parce que vous n'avez pas assigné la valeur EOF
a
. Au lieu de cela vous vérifié si a
est égal à EOF
et puisque c'était vrai (a == -1 == EOF
) imprimer 1
.
NULL
et ''
sont garantis pour évaluer à 0, donc (jette), ils peuvent être considérés comme identiques en valeur; notez toutefois qu'ils représentent deux choses très différentes: NULL
est une valeur null (toujours non valide) pointeur tandis que ''
est le terminateur de chaîne. EOF
au lieu de cela est une constante entière négative qui indique la fin d'un flux; souvent c'est -1, mais la norme ne dit rien au sujet de sa valeur réelle.
C & C++ diffèrent dans le type de NULL
et ''
:
- en C++
''
est unchar
, alors qu'en C c'est unint
; ceci parce qu'en C Tous les caractères littéraux sont considérésint
. en C++
NULL
est" juste " un 0 intégral, alors qu'en C il peut être défini comme un 0 casté àvoid *
; cela ne peut pas être fait en C++ (et c'est explicitement interdit dans une note) parce que, étant C++ plus strict dans les conversions de pointeurs, unvoid *
n'est pas implicitement convertible à tout autre type de pointeur, donc, siNULL
est unvoid *
, il serait nécessaire de le lancer sur le type de pointeur cible lors de l'affectation:int * ptr = (void *) 0; /* valid C, invalid C++ */
citations types pertinentes:
C++98/03
NULL
NULL
est un type entier garanti à évaluer à 0:
4.10 conversions de pointeurs
une constante de pointeur nulle est une constante intégrale expression (5.19) valeur de type entier qui s'évalue à zéro. Une constante de pointeur nulle peut être convertie en un type de pointeur; le résultat est la valeur de pointeur nulle de ce type et est distinguable de chaque autre valeur de pointeur à Objet ou pointeur à type de fonction. Deux valeurs nulles de pointeur du même type doivent être comparées égales. La conversion d'une constante de pointeur nulle en pointeur à cv-type qualifié est une conversion simple, et non la séquence d'une conversion pointeur suivie d'un conversion des qualifications (4.4).
18.1 Types
[...] La macro NULL est un définis par l'implémentation C++ pointeur null constante dans la présente Norme internationale (4.10). ( les définitions possibles comprennent
0
et0L
mais pas(void*)0
).
''
0-valeur char doit exister:
2.2 Caractère ensembles
le jeu de caractères d'exécution de base et le jeu de caractères d'exécution de base contiennent chacun [...] un caractère nul (respectivement null wide character), dont la représentation a tous les bits zéro.
''
est un char
littérale:
2.13.2 caractères littéraux
Un caractère littéral est un ou plusieurs caractères entre guillemets simples, comme dans
'x'
, éventuellement précédée de la lettre L, comme dans l'x’. Un caractère littéral qui ne commence pas par L est un caractère littéral ordinaire, aussi appelé un caractère littéral étroit. Un caractère ordinaire littéral qui contient un seul C-char a le typechar
, avec une valeur égale à la valeur numérique de l'encodage de l' C-char dans le jeu de caractères d'exécution.
et sa valeur est 0, puisque cette séquence d'échappement spécifie son valeur:
L'évasion
\ooo
se compose de la barre oblique inversée suivie d'un, deux ou trois chiffres octaux qui sont pris pour spécifier la valeur du caractère désiré.
''
''
a la même valeur NULL
ce qui est 0 (mais ils signifient des choses différentes), alors que EOF est généralement -1.
printf("%d",a==EOF); //printed 1
dans ce cas vous demandez: est-ce que a = = EOF? si c'est l'impression 1 (ce qui est vrai), il n'est pas d'impression de 0 (ce qui est faux).
'\0' est toujours 0
L'EOF dépend du compilateur
le plus souvent son -1 (gcc et g++ c'est -1).