Что такое значение EOF и '\ 0' в C - PullRequest
34 голосов
/ 16 января 2011

Я знаю, что EOF и '\0' имеют целые числа типа, но если это так, не должны ли они иметь фиксированное значение?

Я напечатал оба и получил -1 для EOF и 0 для '\0'. Но фиксированы ли эти значения?

У меня тоже было это

int a=-1;

printf("%d",a==EOF); //printed 1

Являются ли значения для EOF и '\0' фиксированными целыми числами?

Ответы [ 5 ]

49 голосов
/ 16 января 2011

EOF - это макрос, который расширяется до целочисленного константного выражения с типом int и зависящим от реализации отрицательным значением, но очень часто имеет значение -1. ​​

'\0' представляет собой char со значением0 в C ++ и int со значением 0 в C.

Причина, по которой printf("%d",a==EOF); привела к 1, заключалась в том, что вы не присвоили значение EOF a.Вместо этого вы проверили, было ли a равно EOF и, поскольку это было правдой (a == -1 == EOF), было напечатано 1.

26 голосов
/ 16 января 2011

NULL и '\0' гарантированно равны 0, поэтому (при соответствующих приведениях) их можно считать одинаковыми по значению; заметьте, однако, что они представляют две совершенно разные вещи: NULL - это ноль (всегда недействительный) указатель , а '\0' - символ конца строки. EOF вместо этого - отрицательная целочисленная константа, которая указывает конец потока; часто это -1, но стандарт ничего не говорит о его фактическом значении.

C & C ++ различаются по типу NULL и '\0':

  • в C ++ '\0' - это char, в то время как в C это int; это потому что в C все символьные литералы считаются int s.
  • в C ++ NULL - это "просто" целое число 0, в то время как в C его можно определить как 0, приведенное к void *; это не может быть сделано в C ++ (и это явно запрещено в примечании), поскольку, будучи более строгим в C ++ при преобразовании указателей, void * неявно не преобразуется в любой другой тип указателя, поэтому, если NULL было void * , необходимо будет привести его к целевому типу указателя при назначении:

    int * ptr = (void *) 0; /* valid C, invalid C++ */
    

Соответствующие стандартные предложения:

C ++ 98/03

NULL

NULL - это целочисленный тип, который может быть равен 0:

4.10 Преобразование указателя

Константа нулевого указателя - это целочисленное константное выражение (5.19) r целого типа, которое оценивается как ноль. Константа нулевого указателя может быть преобразована в тип указателя; результат является нулевым значением указателя этого типа и отличается от любого другого значения указателя на объект или указателя на тип функции. Два значения нулевого указателя одного типа должны сравниваться одинаково. Преобразование константы с нулевым указателем в указатель К cv-квалифицированному типу относится одиночное преобразование, а не последовательность преобразования указателя с последующим преобразованием квалификации (4.4).

18,1 Типы

[...] Макрос NULL является константой нулевого указателя C ++, определенной реализацией, в этом международном стандарте (4.10). ( Возможные определения включают 0 и 0L, но не (void*)0).

'\0'

Должен существовать символ с 0 значениями:

2.2 Наборы символов

Базовый набор символов выполнения и базовый набор широких символов выполнения должны содержать [...] нулевой символ (соответственно нулевой широкий символ), представление которого имеет все нулевые биты.

'\0' - это char литерал:

2.13.2 Символьные литералы

Символьный литерал - это один или несколько символов, заключенных в одинарные кавычки, как в 'x', необязательно с предшествующей буквой L, как в L’x ’. Символьный литерал, который не начинается с L, является обычным символьным литералом, также называемым литералом с узким характером. Обычный символьный литерал, который содержит один c-char , имеет тип char, значение которого равно числовому значению кодировки c-char в наборе символов выполнения.

и его значение равно 0, поскольку эта escape-последовательность указывает его значение:

escape \ooo состоит из обратной косой черты, за которой следуют одна, две или три восьмеричных цифры, которые взяты для указания значения нужного символа.

'\0' используется для завершения строковых литералов:

2.13.4 Строковые литералы

После любой необходимой конкатенации, на этапе 7 (2.1) преобразования, '\0' добавляется к каждому строковому литералу, чтобы программы, сканирующие строку, могли найти ее конец.

EOF

Определение EOF делегировано стандарту C89 (как указано в § 27.8.2 «Файлы библиотеки C»), где оно определяется как отрицательное целое число, специфичное для реализации.

C99

NULL

Нулевой указатель представляет собой целое число 0, необязательно приведенное к void *; NULL - нулевой указатель.

6.3.2.3 Указатели

[...] Целочисленное константное выражение со значением 0 или такое выражение, приведенное к типу void *, называется константой нулевого указателя. (Макрос NULL определен в <stddef.h> (и других заголовках) как константа нулевого указателя; см. 7.17.) Если константа нулевого указателя преобразуется в тип указателя, результирующий указатель, называемый нулевым указателем, гарантируется сравнивать неравное с указателем на любой объект или функцию.

7,17 Общие определения <stddef.h>

[...] Макросы

NULL

, который расширяется до определенной в реализации постоянной нулевого указателя; [...]

'\0'

'\0' является целым числом со значением 0 и используется для завершения строк:

5.2.1 Наборы символов

[...] Байт со всеми битами, установленными в 0, называемый нулевым символом , должен существовать в базовом наборе символов выполнения; используется для завершения строки символов.

6.4.4.4 Символьные константы

Целочисленная символьная константа - это последовательность из одного или нескольких многобайтовых символов в одинарных кавычках, как в 'x'. [...]

Восьмеричные цифры, следующие за обратной косой чертой в восьмеричной escape-последовательности, считаются частью построения одного символа для целочисленной символьной константы или одного широкого символа для широкой символьной константы. Числовое значение восьмеричного восьмеричного целого числа указывает значение желаемого символа или широкого символа. [...]

Целочисленная символьная константа имеет тип int.

EOF

EOF является определяемым реализацией отрицательным целым числом

7.19 Вход / выход <stdio.h>

7.19.1 Введение

EOF

, который расширяется до целочисленного константного выражения с типом int и отрицательным значением, которое возвращается несколькими функциями для указания конца файла, то есть больше не вводится из поток

5 голосов
/ 16 января 2011

'\ 0' всегда является нулевым символом или 0. EOF зависит от компилятора, но обычно равно -1 и всегда является значением, которое unsigned char не может содержать.Не полагайтесь на значение EOF, являющегося чем-то, потому что оно МОЖЕТ ИЗМЕНИТЬСЯ.Всегда делайте x == EOF, а не x == -1.Значение '\ 0' ВСЕГДА 0. Вы можете рассчитывать на это.

0 голосов
/ 16 января 2011

'\ 0' всегда равно 0

EOF зависит от компилятора

чаще всего его -1 (в gcc & g ++ это -1).

0 голосов
/ 16 января 2011

Да, они есть. '\0' имеет то же значение NULL, которое равно 0 (но они означают разные вещи), тогда как EOF обычно равно -1.

printf("%d",a==EOF); //printed 1

В этом случае вы спрашиваете: является ли == EOF? если это print 1 (что верно), это не print 0 (что ложно).

...