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?

31
demandé sur Keith Thompson 2011-01-16 17:46:18

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 EOFa. Au lieu de cela vous vérifié si a est égal à EOF et puisque c'était vrai (a == -1 == EOF) imprimer 1.

44
répondu CB Bailey 2015-07-13 17:20:13

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 un char, alors qu'en C c'est un int; ceci parce qu'en C Tous les caractères littéraux sont considérés int.
  • 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, un void * n'est pas implicitement convertible à tout autre type de pointeur, donc, si NULL est un void *, 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 et 0L 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 type char, 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
répondu BlackBear 2011-01-16 14:50:21

'\0' est toujours 0

L'EOF dépend du compilateur

le plus souvent son -1 (gcc et g++ c'est -1).

-1
répondu Kumar Alok 2011-01-16 14:59:11