2016-09-06 3 views
1

До сих пор я узнал, что мы используем getchar() как int, потому что при EOF эта функция возвращает -1. Мне было интересно, не может char удержать -1? я думаю, что может, потому что он может также варьироваться от -128 до 127.Почему функция getchar() в C целочисленная?

Я искал верхний список Google, но ответ, который я получил, не удовлетворил меня.

+2

Итак, что происходит, когда кто-то на самом деле вводит символ, код которого '-1' –

+0

просто печатает -1, я тоже это пробовал. Я думаю, когда getChar() возвращает -1, это другое, а просто набирает -1 через клавиатура! @ M.M –

+2

Я сказал символ, код которого '-1', а не символы' '' и '1' –

ответ

6

Прежде всего, просто чтобы очистить что-то, EOF не требуется, чтобы быть специально -1. Стандарт ISO C требует, чтобы он имел отрицательное значение.

Также обратите внимание, что тип char может быть подписан или без знака; который определяется реализацией.

Функции , getc и getchar могут использоваться для обработки двоичных потоков, а не только для текстовых потоков. Байты имеют значения от 0 до UCHAR_MAX. Естественным типом для этого диапазона является unsigned char. Возвращаемое значение getc не может быть unsigned char, поскольку EOF не представимо. Это также не может быть signed char, потому что signed char не может удерживать значения от 0 до UCHAR_MAX. Таким образом, выбирается более широкий тип: тип int. На основных платформах int шире, чем char: он имеет размер не менее 2. И поэтому он способен отображать некоторое отрицательное значение, которое может использоваться для EOF, и все значения байтов в диапазоне от 0 до UCHAR_MAX.

В некоторых реализациях C (для таких систем, как некоторые чипы DSP) это не так: int - один байт. Это проблемы. При такой реализации C диапазон действительных байтовых значений, возвращаемых getc, должен быть отрицательным, и одно из этих значений сталкивается с EOF. Тщательно написанный код может сказать, что это так: было возвращено значение, равное EOF, но функции feof и ferror сообщают об ошибке: поток не является ошибкой, а конец файла не произошел. Таким образом, значение, которое выглядит как EOF, фактически является действительным байтом.

+1

спасибо за разъяснение по EOF <0, не обязательно EOF = -1. –

4

getchar() и семья возвращают целое число, так что EOF -1 можно отличить от или (unsigned char)255.

+0

Я немного запутался прямо сейчас, я попытался найти (char) из -1, но я не могу его найти? я просто вижу положительные числа на столе[email protected] J Earls –

+0

Если по «таблице» вы имеете в виду карту США ASCII или что-то еще, да, все будут положительными. Однако тип C 'char' является 8-битным ** подписным ** целым типом. Он представляет числа от 0 до 127 и от -128 до -1, а не от 0 до 127 и от 128 до 255. –

0

Шары, использующие кодировку Ascii, сохраняются с использованием байта, который представляет собой неподписанное 8-битовое целое число. Таким образом, символы могут принимать числовое значение 0-255.

GetChar возвращает подписанный Int, чтобы позволить -1, что это магическое число в случае конца файла (EOF)

Смежные вопросы