【问题标题】:Why 'fputc' use an INT as its parameter instead of CHAR?为什么 'fputc' 使用 INT 作为参数而不是 CHAR?
【发布时间】:2010-05-31 13:12:15
【问题描述】:

标准 C 库:

int fputc(int c , FILE *stream);

并且这样的行为多次出现,例如:

    int putc(int c, FILE *stream);
    int putchar(int c);

为什么不按原样使用 CHAR? 如果需要使用 INT,什么时候应该使用 INT 而不是 CHAR?

【问题讨论】:

    标签: function


    【解决方案1】:

    可能(在我看来,由于早期 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);
    }
    

    【讨论】:

    • 但是我们不会在任何时候将 EOF 写入 FILE... 所以你说的“只是镜像”,对吗?^_^
    • 不,你不写 EOF,但是在一个简单的 stdin/stdout 过滤器程序中,只使用一个 (int) 变量而不是尝试强制类型更容易。
    • 这可能是一个因素,但我认为还有一个更根本的原因。请参阅无字符参数...
    • @paxdiablo 很好的解释,但我仍然怀疑 fputs 将参数 int 转换为 unsigned char 的事实,所以人们怎么能放在这个声明上“他们需要更广泛的 int 类型,因为 char 不完全大到足以容纳所有可能的字符加上一件事“当使用 unsigned char 而不是 int 时,为什么我的编译器不会通过战争或错误?
    • @pravu,如果您希望一个函数能够为您提供所有可能的字符以及一个其他值,那么一个字符对于返回值是不够的。标记值 EOF 不能使用其中一个字符进行编码,因为您无法区分流结束和具有该值的真实字符之间的区别。这就是 fgetc 返回 int 而不是 char 的原因。
    【解决方案2】:

    K&R C 中没有字符参数

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

    是的,您可以将参数声明为charfloat,但它被视为intdouble。因此,将接口记录为采用char 参数会有些误导。

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


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

    【讨论】:

      猜你喜欢
      • 2017-04-04
      • 1970-01-01
      • 2011-08-20
      • 1970-01-01
      • 2019-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-01
      相关资源
      最近更新 更多