《C和指针》有一段没有看懂

在第五章70页最下面一段,我打上来了。charch;.......while((ch=getchar())!=EOF)EOF需要的位数比字符型值所能提供的位数要多,这也是... 在第五章
70页最下面一段,我打上来了。
char ch;
.......
while((ch=getchar())!=EOF)
EOF需要的位数比字符型值所能提供的位数要多,这也是getchar返回一个整型值而不是字符型值得原因,然而,把getchar的返回值首先存储于ch中将导致它被截短。然后这个被截断的值被提升为整型并与EOF进行比较。当这段存在错误的代码在使用有符号字符集的机器上运行时,如果读取了一个值为\337的字节时,循环将会终止,因为这个值截断在提升之后与EOF相等。当这段代码在使用无符号字符集的机器上运行时,这个循环将永远不会停止。

这一段看的太纠结了,我甚至没有一句理解了的。
求帮忙解释一下,这一段。十分感谢!问题一个一个说估计每一句都有问题。
1. 1个字符1字节8位,1个int4字节型是32位,所以EOF需要一个32位的返回值吗?
2. 为什么是把getchar的返回值存储到ch中?ch不是保存字符吗?,那我输入的一个字符存储到哪里去了?
3. 如果把getchar的返回值(32位)保存到ch(8位)中,是否只取32位中的前8位其余舍弃?
4. 被截断的值是如何提升为整型的呢?
5. 为何读取\337会终止,也就是EOF为什么遇到十进制223终止?(ASCII范围是0-255。EOF应该遇到-1才会终止吧?为什么是十进制223怎么都想不明白)。
6. 在无符号字符集的机器上为什么会永久循环?

问题有点多能帮我讲及格就行。十分感谢!我没有财富值了。实在不好意思。
展开
 我来答
风若远去何人留
2013-05-15 · 知道合伙人互联网行家
风若远去何人留
知道合伙人互联网行家
采纳数:20412 获赞数:450125
专业C/C++软件开发

向TA提问 私信TA
展开全部
1. yes
2. 输入的字符会先存在缓冲区里面 getchar只是把它读出来然后存到返回值里面 这个过程可以不必管,你可以认为getchar就是读你输入的字符并存到你需要的变量里面
3. 相当于int i = -1; char c; c = i;这样的操作。 c会获取到i的最低8位值
4. 这个情况下是整型降为字符型,字符型如果提升为整型,会保持原来的值
5. 这个\337不知道是从哪里来的,似乎不正确。一般来说,标准C的EOF会定义为-1 也就是0xffffffff 所以应该是读到\377的时候会终止,怀疑\337是\377的笔误
6. 无符号字符集机器,这个说法我也无法理解。没听说过这种机器
个人认为这段程序虽然错误,但不会导致死循环
macinsh
2013-05-15 · TA获得超过104个赞
知道答主
回答量:106
采纳率:0%
帮助的人:138万
展开全部
1.EOF的值通常是-1,getchar返回的是整形,所以就是 0xFFFFFFFF
2.因为这个语句是先执行 ch=getchar(),当然就由ch来存储-1这个值了
3.32位截断为8位,取的是低地址的8位,也就是0xFF
4.0xff再次被提升到32位还是0xff,高地址加0
5.这个地方不知道是你打错了还是书上印错了,应该是/377,即0xFF
6.不知道无符号字符集的机器是什么机器...
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
雨点加油
2013-05-15
知道答主
回答量:56
采纳率:0%
帮助的人:18万
展开全部
太长了,建议分开来问。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式