Function 为什么';fputc';使用INT作为其参数而不是CHAR?

Function 为什么';fputc';使用INT作为其参数而不是CHAR?,function,Function,标准C库: int fputc(int c , FILE *stream); 这种行为发生过很多次,例如: int putc(int c, FILE *stream); int putchar(int c); 为什么不按原样使用CHAR呢? 如果需要使用INT,我什么时候应该使用INT而不是CHAR?最有可能的情况是(在我看来,因为早期C背后的许多基本原理都在时间的深处丢失了),它只是反映了fgetc类型函数中使用的类型,这些函数必须能够返回任何实字符加上EOF特殊字符。fg

标准C库:

int fputc(int c , FILE *stream);
这种行为发生过很多次,例如:

    int putc(int c, FILE *stream);
    int putchar(int c);
为什么不按原样使用CHAR呢? 如果需要使用INT,我什么时候应该使用INT而不是CHAR?

最有可能的情况是(在我看来,因为早期C背后的许多基本原理都在时间的深处丢失了),它只是反映了
fgetc
类型函数中使用的类型,这些函数必须能够返回任何实字符加上
EOF
特殊字符。
fgetc
函数将下一个字符转换为
int
,并使用特殊标记值
EOF
指示流的结束

要做到这一点,他们需要更宽的
int
类型,因为
char
不够大,无法容纳所有可能的字符和一个字符

而且,由于C的开发人员似乎更喜欢使用一种相当简单的方法来编写代码,因此他们应该使用相同的类型,以允许编写以下代码:

filecopy(ifp, ofp)
    FILE *ifp;
    FILE *ofp;
{
    int c;
    while ((c = fgetc (ifp)) != EOF)
        fputc (c, ofp);
}
K&R C中没有字符参数 一个原因是在C的早期版本1中没有
char
参数

是的,您可以将参数声明为
char
float
,但它被认为是
int
double
。因此,如果将一个接口记录为使用
char
参数,可能会有点误导

我相信这在今天仍然适用于没有原型的函数,以便能够与旧代码进行互操作。

1.很早,但仍然很普遍。C很快就取得了成功,成为第一种(而且大多数情况下,也是唯一一种)广泛成功的系统编程语言。

但我们不会在任何时候将EOF写入文件。。。所以你说“简单镜像”,对吗?^ ^不,你不写EOF,但是在一个简单的stdin/stdout过滤器程序中,只使用一个(int)变量比尝试强制类型更容易。这可能是一个因素,但我认为有一个更根本的原因。看不到任何字符参数…@paxdiablo很好的解释,但我仍然怀疑FPUT将参数int转换为无符号字符这一事实,因此我们如何理解这句话“他们需要更宽的int类型,因为一个字符不够大,无法容纳所有可能的字符和另外一个字符”当使用unsigned char代替int时,为什么我的编译器不检查或出错?@pravu,如果你想让一个函数能够给你所有可能的字符加上一个其他值,一个字符对于返回值来说是不够的。前哨值EOF不能使用其中一个字符进行编码,因为您无法分辨流结束字符和具有该值的真实字符之间的差异。这就是为什么fgetc返回int而不是char。