为什么字符函数接受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);
Run Code Online (Sandbox Code Playgroud)
字符和整数在C中相当紧密.
从输入流接收字符时,它必须能够表示每个字符加上文件结束符号.
这意味着char类型不够大,所以他们使用更宽的类型.
C99理由文件指出:
由于这些函数通常主要用作宏,因此它们的域仅限于无符号字符中可表示的小正整数加上EOF的值.EOF传统上是-1,但可以是任何负整数,因此可以与任何有效的字符代码区分开.因此,通过将参数用作小数组属性的索引,可以有效地实现这些宏.
标准本身就是这样说的:
标头
<ctype.h>声明了几个用于分类和映射字符的函数.在所有情况下,参数都是一个int,其值应表示为unsigned char或者等于宏EOF的值.如果参数具有任何其他值,则行为未定义.
当 C 第一次发明时,没有对函数参数进行编译时检查。如果调用foo(bar,boz)、 和bar的boz类型为int,编译器会将两个int值压入堆栈,调用foo,并希望它期望获得两个int值。int由于在计算表达式时会提升小于的整数类型int,因此在原型发明之前编写的 C 函数无法传递任何更小的整数类型。