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
и отрицательным значением, которое возвращается несколькими функциями для указания конца файла, то есть больше не вводится из
поток