Подтвердить что ты не робот

Что такое значение EOF и '\ 0' в C

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

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

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

int a=-1;

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

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

4b9b3361

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

'\ 0' всегда 0

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

чаще всего его -1 (в gcc и g++ оно равно -1).