Ответ 1
EOF
- это макрос, который расширяется до целочисленного постоянного выражения с типом int
и зависимым от реализации отрицательным значением, но очень часто -1.
'\0'
- это char
со значением 0 в С++ и int
со значением 0 в C.
Причина, по которой printf("%d",a==EOF);
привела к 1
, состояла в том, что вы не присвоили значение EOF
a
. Вместо этого вы проверили, был ли a
равным EOF
, и поскольку это было верно (a == -1 == EOF
), оно напечатало 1
.
Ответ 2
NULL
и '\0'
гарантированно оцениваются до 0, поэтому (с соответствующими приведениями) их можно считать одинаковыми по стоимости; однако они представляют две разные вещи: NULL
- это нулевой (всегда недействительный) указатель, а '\0'
- это ограничитель строки. EOF
вместо этого является отрицательной целочисленной константой, которая указывает конец потока; часто это -1, но стандарт ничего не говорит о его фактическом значении.
C и С++ отличаются типом NULL
и '\0'
:
- в С++
'\0'
есть char
, а в C это an int
; это потому, что в C все символьные литералы считаются int
s.
-
в С++ NULL
является "просто" интегралом 0, а в C его можно определить как 0, отлитый от void *
; это не может быть сделано в С++ (и это явно запрещено в заметке), поскольку, будучи более строгим в С++ преобразованиями указателей, void *
неявно не конвертируется в любой другой тип указателя, поэтому, если NULL
был void *
, необходимо было бы привязать его к типу целевого указателя при назначении:
int * ptr = (void *) 0; /* valid C, invalid C++ */
Соответствующие стандартные цитаты:
С++ 98/03
NULL
NULL
- целочисленный тип, гарантированный для вычисления 0:
4.10 Преобразования указателей
Константа нулевого указателя является интегральным постоянным выражением (5.19) rvalue целочисленного типа, который вычисляется до нуля. Константа нулевого указателя может быть преобразована в тип указателя; результатом является нулевое значение указателя этого типа и отличается от любого другого значения указателя на объект или указателя на тип функции. Два значения нулевого указателя того же типа сравниваются равными. Преобразование константы нулевого указателя в указатель to cv-qualified type - это одно преобразование, а не последовательность преобразования указателя с последующим квалификационным преобразованием (4.4).
18.1 Типы
[...] Макрос NULL представляет собой константу нулевого указателя С++, определенную реализацией, в этом международном стандарте (4.10). (Возможные определения включают 0
и 0L
, но не (void*)0
).
'\0'
Должно существовать 0-значение char:
2.2 Наборы символов
Основной набор символов выполнения и набор символов широкого исполнения должны содержать [...] нулевой символ (соответственно нулевой широкий символ), представление которого имеет все нулевые биты.
'\0'
является литералом char
:
2.13.2 Литералы символов
Символьный литерал - это один или несколько символов, заключенных в одинарные кавычки, как в 'x'
, необязательно предшествующие букве L, как в Lx. Литеральный символ, который не начинается с L, является литералом обычного характера, также называемым литералом узкого символа. Литерал обычного характера, который содержит один c- char, имеет тип char
со значением, равным числовому значению кодирования c- char в наборе символов выполнения.
и это значение равно 0, поскольку эта 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
и отрицательным значением, которое возвращается несколькими функциями для указания конца файла, то есть больше нет ввода из Поток