Что ж, несколько месяцев назад я прочитал еще одну «хорошо известную» книгу C (на моем языке), и я так ничего и не узнал об этом. То, как K&R пишет 3 главы на 20 страницах, просто потрясающе, и, конечно, я не могу ожидать огромных объяснений, но это также вызывает вопросы.
У меня есть вопрос по этому пункту 1.5.1 В книге говорится (стр. 16):
main(){
int c;// <-- Here is the question
c=getchar();
while (c != EOF){
putchar(c);
c = getchar();
}
}
[...] Тип char специально предназначен для хранения таких символьных данных, но можно использовать любой целочисленный тип. Мы использовали int по тонкой, но важной причине. Проблема заключается в том, чтобы отличить конец ввода от действительных данных. Решение состоит в том, что getchar возвращает отличительное значение, когда больше нет ввода, значение, которое нельзя связать с каким-либо реальным символом. Это значение называется EOF, что означает «конец файла». Мы должны объявить c достаточно большим типом, чтобы хранить любое значение, которое возвращает getchar. Мы не можем использовать char, так как c должен быть достаточно большим, чтобы содержать EOF в дополнение к любому возможному char. Поэтому мы используем int.[...]
После поиска в Google другого объяснения:
EOF — это специальный макрос, представляющий конец файла (Linux: используйте CTRL+d на клавиатуре, чтобы создать его, команда Windows: используйте CTRL+z (может быть, в начале новой строки с последующим RETURN)): часто EOF = -1, но зависит от реализации. Должно быть значение, которое не является допустимым значением для любого возможного символа. По этой причине c имеет тип int (а не char, как можно было бы ожидать).
Итак, я изменил исходный код с int на char, чтобы увидеть, в чем проблема, с получением значений EOF... но проблем нет. Работает так же.
Я также не понял, как getchar берет каждый символ, который я пишу, и печатает все. Тип Int имеет длину 4 байта, поэтому он может содержать 4 символа внутри переменной. Но я могу поставить любое количество символов, он будет читать и писать все одинаково. И с char происходит то же самое... Что происходит на самом деле? Где хранятся значения, когда символов больше 1-4?