以下函数使用
int
作为第二个参数类型,memchr(const void *buf, int ch, size_t count);
虽然它用于字符
类型。为什么函数定义要使用int
作为char
类型的参数?这是否有特殊原因?
void *memchr(); /* non-prototype declaration */
int some_KandR_function(a, b, c)
char a;
short b;
float c;
{
}
int some_KandR_function(int a, int b, double c);
但不包括
int some_KandR_function(char a, short b, float c); // <- Incorrect!
EOF
,一个(必然为负数,通常为-1)值,用于在带内信号结束文件。这就是为什么例如 fgetc
返回 int
,或者 isalnum
只需要一个:两者都使用 unsigned char
和 EOF
,后者不能表示为 unsigned char
。 - MasklinnC语言不会将小于int的参数传递给函数。将函数参数定义为char或short总是升级为int,将unsigned char或unsigned short参数定义为无符号int。
如果无符号与有符号char是问题,他们会使用short(我不记得有一个平台short是1个字节长)。
当然,使用int处理无符号与有符号char的可能性,因为memchr仅比较相等性。
因为 char
、signed char
和 unsigned char
是三种不同的类型。在特定的实现中,你不知道 char
是有符号还是无符号的。
除了一些罕见的系统(参见 Keith 的注释),类型 int
包含这三种类型可以拥有的所有值。
sizeof (int) == 1
(意味着 CHAR_BIT >= 16
),那么 int
可能无法容纳所有 unsigned char
类型的值。这样的系统很少见。 - Keith Thompson