使用int或char数据类型,并从K&;R-“;C编程语言;书
首先,请原谅我提出这个问题,因为已经有几十个类似的变体了。然而,我不能完全肯定我是否能正确理解它。所以,请让我解释一下我理解了什么,如果我错了,请纠正我 这是K&R手册中的一个示例:使用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
#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
,那么它仍然可以工作,但如果我们输入一个等于或大于ASCII 128的字符,它就会出错将发生什么?signed char
将返回所选数据类型的最大可能ASCII值,127getchar()
- 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)或系统使用的任何编码样式的字符开始
int c = getchar();
char c = getchar(); // this is wrong
unsigned char d = getchar(); // also wrong
signed char e = getchar(); // also wrong