2012-04-14 2 views
1

Это пример кода от Язык программирования C от Ritchie & Kernighan.Обратные символы

int c; 
     while((c=getchar())!=EOF) { 
      putchar(c); 
     } 

Обратите внимание, что putchar referes переменной типа INT. Почему можно возвращать и отображать оба символа и целые числа с этим кодом?

ответ

4

int обычно представлен 4 байтами, а char - фактически всего 1 байт данных. Вы можете легко сохранить полный символ и больше в одном int, который возвращает getchar(). Когда int передается в putchar(int), он просто удаляет лишнее пространство перед его отображением. Этот метод полезен для передачи EOF, который фактически не является char, а int, который сигнализирует о конце файла.

+0

Обратите внимание, что причина использования int вместо char заключается в том, что система должна иметь возможность сигнализировать EOF - и для этого используется специальное возвращаемое значение -1 (что эквивалентно константе EOF). Поскольку этот -1 не вписывается в char, результат getchar() вместо этого сохраняется как int. – mfrankli

+0

Формулировка делает звук таким, как int, обычно 4 байта (true), а символ обычно 1 байт (не совсем так, потому что char всегда * 1 байт). Тем не менее, +1 за хороший ответ. –

+0

@mfrankli: вы * можете * поместить -1 в 'char', если тип' char' будет реализован, и многие из них, и правила преобразования позволяют '-1' быть преобразованы в' char', если это подписан. Причина 'getchar' возвращает' int', потому что она всегда * подписана, а 'EOF' определяется как любое отрицательное число (не обязательно -1, но обычно оно). – dreamlax

1

Тип char - это не что иное, как целое число, которое в большинстве случаев представляет собой только 8-битный байт. Тип int представляет собой целое число, которое обычно шире и поэтому может сохранять все возможные значения, которые может хранить символ. Чтобы выполнить проверку, она должна содержать это значение sizeof(int) > sizeof(char). Почти всегда это так. Но если я хорошо помню, сказано, что стандарт не предусматривает этого; это означает, что единственный переносимый и безопасный способ проверить, является ли уже прочитанный EOF реальным концом файла или нет, его нужно проверить с помощью feof(FILE *). (Например, если в вашей системе CHAR_BIT равно 16, sizeof (char) == 1 по определению, но sizeof (int) может быть 1 тоже).

+0

Стандарт гарантирует только 'sizeof (long)> = sizeof (int)> = sizeof (short)> = sizeof (char)', и я знаю некоторый DSP (от TI), который имеют 'CHAR_BIT == 32' и' sizeof (long) = 1' –

+0

, хотя, я полагаю, на тех машинах то, что вы делаете большую часть времени, - это не входы ввода-вывода файлов за время; поэтому на обычных машинах мы работаем каждый день, это не проблема; но, конечно, стоит упомянуть об этом. – ShinTakezou

1

getchar() возвращается int так, что он может надежно удерживать значение EOF (которое определяется как любое отрицательное целое число, а в большинстве реализаций это -1). Тип char может быть подписан или без знака в зависимости от реализации. Если он будет подписан, то может быть в состоянии удерживать значение EOF при условии, что EOF находится в пределах зоны действия signed char типа, и если он не подписан, то он может стать неотличимым от фактического значения символа, когда EOF преобразуется в unsigned char type.

+0

Я верю, что 'getchar' возвращает int, потому что эта функция существовала до того, как K & R добавили прототипы функций к языку. В то время * все * функции возвращали int. Затем они использовали этот факт для сжатия значения EOF. –

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