ANSI C: почему символьные функции принимают аргумент int вместо аргумента char? - PullRequest
6 голосов
/ 16 февраля 2012

Почему символьные функции принимают аргумент int вместо аргумента char?

<ctype.h>

int isalnum(int c); 
int isalpha(int c); 
int iscntrl(int c); 
int isdigit(int c); 
int isgraph(int c); 
int islower(int c); 
int isprint(int c); 
int ispunct(int c); 
int isspace(int c); 
int isupper(int c); 
int isxdigit(int c); 
int tolower(int c); 
int toupper(int c); 

Ответы [ 4 ]

9 голосов
/ 16 февраля 2012

Символы и целые числа довольно тесно связаны в C.

Когда вы получаете символ из входного потока, он должен иметь возможность представлять каждый отдельный символ плюс конецсимвол файла.

Это означает, что тип char не будет достаточно большим, поэтому они используют более широкий тип.

Обоснование документа C99 гласит:

Поскольку эти функции часто используются в основном как макросы, их область ограничена маленькими положительными целыми числами, представленными в беззнаковом символе, плюс значением EOF.EOF традиционно равен -1, но может быть любым отрицательным целым числом и, следовательно, отличаться от любого допустимого кода символа.Таким образом, эти макросы могут быть эффективно реализованы путем использования аргумента в качестве индекса в небольшом массиве атрибутов.

В самом стандарте есть следующее:

Заголовок <ctype.h> объявляет несколько функций, полезных для классификации и сопоставления символов.Во всех случаях аргументом является int, значение которого должно быть представлено как беззнаковый символ или должно равняться значению макроса EOF.Если аргумент имеет любое другое значение, поведение не определено.

3 голосов
/ 16 февраля 2012

Когда C был впервые изобретен, не было никакой проверки аргументов функции во время компиляции. Если бы один из них вызывал foo(bar,boz), а bar и boz имел тип int, компилятор поместил бы два значения int в стек, вызвал бы foo и надеялся бы получить два int ценности. Поскольку целочисленные типы, меньшие чем int, при вычислении выражений повышаются до int, функции C, которые были написаны до изобретения прототипов, не могли передавать ни один меньший целочисленный тип.

3 голосов
/ 16 февраля 2012

Они должны принимать EOF в дополнение к нормальным значениям символов.Они также предшествуют изобретению функциональных прототипов.В то время не было никакого способа передать char в функцию - он всегда сначала повышался до int.

0 голосов
/ 16 февраля 2012

Да, это может быть для EOF, который всегда является не символьным значением, хотя точное значение EOF может отличаться в разных системах, но оно никогда не будет таким, как любой символьный код.

...