ANSI C:为什么字符函数接受int参数而不是char参数?

时间:2012-02-16 07:39:35

标签: c char

为什么字符函数接受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 个答案:

答案 0 :(得分:9)

字符和整数在C中相当紧密。

当您从输入流收到一个字符时,它必须能够表示每个字符加上文件结束符号。

这意味着char类型不够大,因此它们使用更宽的类型。

C99理由文件指​​出:

  

由于这些函数通常主要用作宏,因此它们的域仅限于unsigned char中可表示的小正整数加上EOF的值。 EOF传统上是-1,但可以是任何负整数,因此可以与任何有效的字符代码区分开。因此,通过将参数用作一小部分属性的索引,可以有效地实现这些宏。

标准本身就是这样说的:

  

标题<ctype.h>声明了几个对分类和映射有用的函数   字符。在所有情况下,参数都是一个int,其值应为   可表示为无符号字符或等于宏EOF的值。如果   参数有任何其他值,行为未定义。

答案 1 :(得分:3)

除普通字符值外,他们还必须接受EOF。它们也早于功能原型的发明。那时,无法将char传递给某个函数 - 它始终首先提升为int

答案 2 :(得分:3)

当C最初发明时,没有编译时检查函数参数。如果一个名为foo(bar,boz)barboz的类型为int,则编译器会在堆栈上推送两个int值,调用foo },并希望它期望获得两个int值。由于在计算表达式时,小于int的整数类型被提升为int,因此在原型发明之前编写的C函数无法传递任何较小的整数类型。

答案 3 :(得分:0)

是的,可能是为了容纳总是非char值的EOF,尽管EOF的确切值可能因系统不同而有所不同,但它永远不会与任何字符代码相同。