c - 用于保存 getchar() 输入的变量的数据类型,作为 char 而不是 int

标签 c getchar kernighan-and-ritchie

#include<stdio.h>

int main()

{


    int c;

    while((c=getchar())!=EOF)
       putchar(c);
    putchar(c);     //2nd putchar     
    getch();


}

在《C by Ritchie n Kernighan》一书中的上述代码中,将 c 声明为 int 变量的原因如下:

so that c may be able to hold the code of EOF which is outside the char codes which a char datatype can accommodate.

但是当我将 c 声明为字符并输入 EOF(CTRL-Z + Enter)时,该值(在我的计算机上为 -1)确实会进入 c 并且我立即结束up 退出 while up,就像我将 c 声明为 int 时发生的情况一样。 当 char 工作正常时,为什么我们需要将 c 声明为 int?或者我在这里遗漏了什么?

还有一件事,在第二个 putchar 语句中,它应该在收到 EOF 后打印 c 的最后一个值(即 -1),但它没有。为什么?

最佳答案

char 有符号还是无符号是由实现定义的。

如果 char 是无符号的,则 char 值不能等于 EOF,循环将永远不会退出。

如果 char 有符号,则 EOF 可能等于 c,这就是您计算机上发生的情况。但问题是,这也意味着,有效的 char 可能等于 EOF,导致循环过早退出。

关于c - 用于保存 getchar() 输入的变量的数据类型,作为 char 而不是 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24381628/

相关文章:

c - 将 POSIX 信号量的值增加 1 以上

c - 一次从文件中读取两行

c - 当 'Enter' 时结束 while 循环

c - C中使用getchar存储用户输入的多个字符

c - 将函数重新声明为 int K&R 6.3

java - android jni 从静态方法到非静态方法

c++ - int64_t 背后的魔力是什么

c - 几个 getchar 电话

c - 在 C 中使用寄存器变量的一个很好的例子是什么?

c - 字符到整数转换的巧妙之处