Почему функция 'lower' имеет тип int в качестве типа возврата и типа ввода?
Код полностью int
математический.Даже если бы подпись была char c
, код имел бы результат int
из-за обычных целочисленных повышений.
int lower(int c) {
return (c >= 'A' && c<= 'Z') ? c + 'a' - 'A' : c;
}
Для отображения обычно 257 различных значений, таких как tolower()
.С int lower(char c) {
и c < 0
это может работать не так, как tolower()
.
int
обычно близко к целочисленному размеру собственного процессора, а код обычно самый быстрый и быстрый с int
против char
.Это исторически сложившийся выбор и компромисс.Включение исходного C не создало прототип сигнатуры функции, и все аргументы int
и sub- int
были переведены в int
.
7.4 Обработка символов
Заголовок <ctype.h>
объявляет несколько функций, полезных для классификации и сопоставления символов.Во всех случаях аргументом является int
, значение которого должно быть представлено как unsigned char
или равным значению макроса EOF
.Если аргумент имеет любое другое значение, поведение не определено.C11dr §7.4 1
Эти is...()
и to...()
функции работают в unsigned char range
(и EOF
), а не char
.
Устойчивый код позволит избежатьотрицательный char
при вызове tolower()
или tolower()
-подобных функций.
// printf("%c -> %c\n", s[i], lower(s[i]));
printf("%c -> %c\n", s[i], lower((unsigned char) s[i]));