C EOF символьное значение и знак со знаком - PullRequest
1 голос
/ 14 августа 2011

сегодня я просто лежу на кровати, размышляя о программировании, когда в меня приходит мысль, которую я не могу решить своими собственными способностями. Ниже вопрос.

Я прочитал книгу, в которой объясняется, почему значение EOF равно -1, а объяснение следующее:

Почему -1? Обычно getchar () возвращает значение в диапазоне от 0 до127, потому что это значения, соответствующие стандартному набору символов, но он может возвращать значения от 0 до 255, если система распознает расширенный набор символов.В любом случае значение -1 не соответствует ни одному символу, поэтому его можно использовать для обозначения конца файла.

1.) Это странное утверждение выше, потому что я помню, кромецелое число со знаком, символ со знаком также является одним из типов переменных, существующих в C, так что это означает, что можно использовать значение от -128 до 127. Но почему упоминание в книге -1 не противоречит использованию символов для ввода с клавиатуры ??

Ответы [ 6 ]

3 голосов
/ 15 августа 2011

Ни в одном из полученных вами ответов не упоминалось о том, что (по крайней мере, IMO) имеет решающее значение.

Когда вы читаете символ, значение читается как unsigned char и преобразуется оттуда в int (§7.19.7.1 / 2):

Если индикатор конца файла для входного потока, на который указывает поток, не установлен, и следующий символ присутствует, функция fgetc получает этот символ как неподписанный char преобразуется в int и перемещает соответствующий индикатор положения файла для поток (если определен).

Эта конкретная цитата для fgetc - getc, getchar и fread - все они необходимы для чтения данных, как если бы они вызывали fgetc.

Это неявно (по крайней мере, вроде) предполагает, что char имеет меньший диапазон, чем int, поэтому преобразование в int позволяет представить по крайней мере одно значение, которое не могло быть получено из файла , В другом месте стандарт отрицает это как требование, но я думаю, что отказ нереалистичен - я уверен, что реализация с char и int одинакового размера нарушит огромное количества кода.

3 голосов
/ 14 августа 2011

getchar фактически возвращает int, что означает, что он имеет более 8 бит.Если getchar возвращает число от 0 до 255 (включительно), то вы знаете, что он вернул верный байт из файла, который вы читали.Если он возвращает -1, вы знаете, что достигли конца файла.Поскольку значение равно int, -1 гарантированно не будет равно любому значению от 0 до 255.

3 голосов
/ 14 августа 2011

Стандарт не говорит, что это -1.

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

Это не значение, которое вы можете прочитать из файла.Это значение «out of band», которое getc не может быть возвращено в любом случае, кроме «end of file».

0 голосов
/ 14 августа 2011

getchar () возвращает int.-1 для EOF или от 0 до 255. Тип int достаточно велик, чтобы не конфликтовать с ними.

0 голосов
/ 14 августа 2011

getchar() возвращает целое число, которое содержит либо обычный (без знака) символ, либо EOF, поэтому проблем нет.

0 голосов
/ 14 августа 2011

Вот почему getchar () возвращает int.Если бы он возвратил подписанный символ, вы не смогли бы различить EOF и символ -1 (128 от расширенного набора), если он возвратил неподписанный символ, то -1 не будет иметь никакого смысла.Однако getchar () возвращает int, и если он находится в диапазоне от 0 до 255, это символ, но если он возвращает -1, тогда это EOF

...