使用int或char数据类型,并从K&;R-“;C编程语言;书

使用int或char数据类型,并从K&;R-“;C编程语言;书,c,C,首先,请原谅我提出这个问题,因为已经有几十个类似的变体了。然而,我不能完全肯定我是否能正确理解它。所以,请让我解释一下我理解了什么,如果我错了,请纠正我 这是K&R手册中的一个示例: #include <stdio.h> main() { 1) int c; 2) 4) while ((c = getchar()) != EOF) 3) putchar(c); } #包括 main() { 1) INTC; 2) 4)wh

首先,请原谅我提出这个问题,因为已经有几十个类似的变体了。然而,我不能完全肯定我是否能正确理解它。所以,请让我解释一下我理解了什么,如果我错了,请纠正我

这是K&R手册中的一个示例:

    #include <stdio.h>

    main()
    {
1)      int c;

2) 4)   while ((c = getchar()) != EOF)
3)      putchar(c);
    }
#包括
main()
{
1) INTC;
2) 4)while((c=getchar())!=EOF)
3) 普查尔(c);
}
因此,我对上述计划的理解如下:

1) 我们将
c
声明为
int
而不是
char
,因为使用
char
数据类型不能始终正确运行,最终会将其搞糟
Char
数据类型根据系统的不同而有所不同,默认情况下可以是
已签名的
[−127、+127]或
无符号
[0255]。另外,
EOF
在默认情况下并不总是
-1
,因为它也取决于系统和编译器

  • 1.1)因此,如果我们将
    c
    声明为
    char
    ,并且它在系统上默认为
    signed char
    ,那么它仍然可以工作,但如果我们输入一个等于或大于ASCII 128的字符,它就会出错将发生什么?
    getchar()
    将返回所选数据类型的最大可能ASCII值,127

  • 1.2)相反,如果我们将
    c
    声明为
    char
    ,并且在系统上默认为
    unsigned char
    ,那么
    getchar()
    将始终等于
    EOF
    ,因为我们无法存储负值,对吗?

因为上面的所有变体都正确地将
c
声明为
int
,以避免可能的冲突

2) 我们键入一些字符作为输入
c=getchar()
获取此输入,并将其转换为ASCII数字,然后检查以确保它不等于
EOF

3) 如果等于
EOF
,则将输入字符显示为输出

4) 它回到一种状态,我们必须输入新字符才能继续循环

以上都对吗

[附加问题]另外,语句
getchar()!=EOF
1
0
作为值输出
1
值意味着
getchar()
不等于
EOF
。而
0
作为值将显示
getchar()
实际上等于
EOF
,对吗

[附加问题]我在这里看到另一个用户关于堆栈溢出的另一个问题,关于
getchar()
char
数据类型,但是,我无法理解的答案

你的程序运行不正常;它无法分辨 在EOF和255之间

这意味着什么?你能给我解释一下吗?此外,我也不明白这意味着什么:

0到7(#255)和EOF可以表示为1111…32 时代。。。。。(假设整数为4字节)?这里不会有冲突


更新

谢谢大家!!关于这一点:

0到7(#255)和EOF可以表示为1111…32
时代。。。。。(假设整数为4字节)?不会有冲突
这里。

如果我在下面的所有答案和解释之后理解正确。这意味着值为
-1
EOF
将被表示为
1111111
,例如,如果数据类型为
char
,则它将认为是#255,因为它只有8位,并且将完全按照0xFF(#255)存储在内存中,没有其他指示(简单地说:数据丢失了,现在不是值
-1
而是完全不同的含义),正确吗?因此,为了避免这种混淆,我们在声明
c
int
时分配4个字节,以确保数据不会丢失,并且它将
EOF
-1
存储在32位中,比如
32次…1111111111
,包括一个它也是负值的符号。正确理解它? 再次感谢

1.1因此,如果我们将
c
声明为
char
,并且在系统上默认为
signed char
,那么它仍然可以工作,但如果我们输入一个等于或大于ASCII 128的字符,它就会出错

如果
char
是有符号的,则128以上字符的位模式将被解释为负有符号值。当输入字符
255
nbsp
在扩展ASCII中)时,将发生唯一真正的混乱,因为在用-1表示的系统上,它将被解释为
EOF

1.2相反,如果我们将
c
声明为
char
,并且在系统上默认为
unsigned char
,那么
getchar()
将始终不等于
EOF
,因为我们无法存储负值,对吗

这是正确的,它永远不会等于
EOF
。当升级到
int
EOF
进行比较时,
unsigned char
中的任何位模式都会在0到255之间(包括0到255之间)。因此,即使
getchar()
实际返回
EOF
,比较也会是错误的

我们键入一些字符作为输入
c=getchar()
获取此输入,并将其转换为ASCII数字,然后检查以确保它不等于
EOF

没有进行ASCII转换;字符以ASCII字符(假设系统使用ASCII)或系统使用的任何编码样式的字符开始

  • 如果它不等于t
    int c = getchar();
    
    char c = getchar();          // this is wrong
    unsigned char d = getchar(); // also wrong
    signed char e = getchar();   // also wrong