web-dev-qa-db-fra.com

Quelle est la valeur de EOF et '\ 0' en C

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?

34
theReverseFlick

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.

49
CB Bailey

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':

  • en C++ '\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 ints.
  • 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:

C++ 98/03

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 et 0L, 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 type char, 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.

C99

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 macro NULL 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

26
Matteo Italia

'\ 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.

5
Leo Izen

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).

0
BlackBear