В C строки являются массивами символов char (char *
) и символы обычно хранятся в char
. Я заметил, что некоторые функции из libC берутся за целые числа аргументов вместо char.Почему putchar, toupper, tolower и т. Д. Берут int вместо char?
Например, возьмем функции toupper()
и tolower()
, которые оба используют int
. Страница человек говорит:
Если с не является символьное значение без знака, или EOF, поведение этих функций не определено.
Я думаю, что с int
, toupper
и tolower
способны справиться с unsigned char
и EOF
. Но на самом деле EOF
на практике (есть ли какое-либо правило о его значении?) Значение, которое может быть сохранено с помощью char
, и поскольку эти функции не преобразуют EOF
во что-то еще, мне интересно, почему toupper
не просто принимает char как аргумент.
В любом случае, почему мы должны принимать что-то, что не является символом (например, EOF)? Может ли кто-нибудь предоставить мне соответствующий прецедент?
Это похоже fputc
или putchar
, что также принять int
, который преобразуется в unsigned char
в любом случае.
Я ищу точные мотивы для этого выбора. Я хочу убедиться, я не хочу отвечать, что не знаю, спросит ли кто-нибудь меня однажды.
Я не знаю ни одного правила, 'EOF' должны соответствовать в' char', и я могу заверить вас, что 'char' не гарантированно будет подписан, что делает ваше обсуждение об использовании' char' вместо 'unsigned char' кажутся неправильными. Вы имеете в виду «подписанный символ». –
Вы посмотрели на реализацию этих функций. Я думаю, что параметр 'int' предназначен для целей оптимизации, потому что его размер байтов хорошо подходит для размеров регистров процессора. В свою очередь, одна байтовая переменная 'char' должна быть преобразована в' int' за занавеской, и для этой операции требуется некоторое время процессора для обработки. – sgnsajgon
Прочтите следующее: [Определение EOF и способы его эффективного использования] (http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?id=1043284351&answer=1048865140) –