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

Hao*_*eng 7 function

标准C lib:

int fputc(int c , FILE *stream);
Run Code Online (Sandbox Code Playgroud)

这种行为发生了很多次,例如:

    int putc(int c, FILE *stream);
    int putchar(int c);
Run Code Online (Sandbox Code Playgroud)

为什么不使用CHAR,因为它真的是?如果需要使用INT,何时应该使用INT而不是CHAR?

pax*_*blo 10

有可能(在我看来,因为大部分的背后ç早期的基本原理是在时间的深处丢失),它是简单地反映在使用的类型fgetc类型的功能必须能够返回任何真正的性格加上EOF特殊字符.该fgetc函数将下一个字符转换为a int,并使用特殊标记值EOF来指示流的结尾.

要做到这一点,他们需要更广泛的int类型,因为它char不足以容纳所有可能的角色再加上一件事.

而且,由于C的开发人员似乎更喜欢采用相当极简主义的代码方法,因此有意义的是他们会使用相同的类型,以允许代码,例如:

filecopy(ifp, ofp)
    FILE *ifp;
    FILE *ofp;
{
    int c;
    while ((c = fgetc (ifp)) != EOF)
        fputc (c, ofp);
}
Run Code Online (Sandbox Code Playgroud)

  • @paxdiablo很好的解释,但我仍然怀疑fputs将参数int转换为unsigned char的事实,所以如何在这个语句上放置"他们需要更广泛的int类型,因为char不够大,不能容纳所有可能的字符加上还有一件事"为什么我的编译器在使用unsigned char而不是int时通过warring或者错误? (2认同)

Dig*_*oss 5

K&R C 中没有字符参数

原因之一是在C 的早期版本1中没有char参数。

是的,您可以将参数声明为charorfloat但它被认为是intor double。因此,将接口记录为接受char参数会有些误导。

我相信今天对于没有原型声明的函数仍然如此,以便它可以与旧代码进行互操作。


1. 早期,但仍然普遍。C 很快取得了成功,并成为第一个(并且仍然是唯一的)广泛成功的系统编程语言。