| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 351 人关注过本帖
标题:关于《C陷阱》中不明白的部分,求指教!
只看楼主 加入收藏
woaiBCH
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2013-2-26
结帖率:0
收藏
 问题点数:0 回复次数:3 
关于《C陷阱》中不明白的部分,求指教!
在《C陷阱》中,第四章,4.4节最后一段例子,原文如下:
main() {
int i;
char c;
for(i = 0; i < 5; i++) {
scanf("%d", &c);
printf("%d", i);
}
printf("/n");
}
表面上看,这个程序从标准输入中读取五个整数并向标准输出写入0 1 2 3 4。实际上,它并不总是这么做。譬如在一些编译器中,它的输出为0 0 0 0 0 1 2 3 4。
为什么?因为c的声名是char而不是int。当你令scanf()去读取一个整数时,它需要一个指向一个整数的指针。但这里它得到的是一个字符的指针。但scanf()并不知道它没有得到它所需要的:它将输入看作是一个指向整数的指针并将一个整数存贮到那里。由于整数占用比字符更多的内存,这样做会影响到c附近的内存。
c附近确切是什么是编译器的事;在这种情况下这有可能是i的低位。因此,每当向c中读入一个值,i就被置零。当程序最后到达文件结尾时,scanf()不再尝试向c中放入新值,i才可以正常地增长,直到循环结束。
问题一:我在使用cb进行编译后输出的结果为:0 0 0 0 0,并没有1 2 3 4,我认为编译出的结果是合理的,但是不明白为什么书中提到的输出结果会多出1 2 3 4 。
问题二:原文:“当程序最后到达文件结尾时,scanf()不再尝试向c中放入新值,i才可以正常地增长,直到循环结束。” 这句话不是很明白,请了解的网友前来指教。
搜索更多相关主题的帖子: 编译器 
2014-03-05 16:54
xiaozi2013
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:四川成都
等 级:蒙面侠
威 望:6
帖 子:830
专家分:4331
注 册:2013-12-13
收藏
得分:0 
char c;
scanf("%d", &c);

--整天敲那些破代码能找着媳妇儿吗。。。---
2014-03-05 18:03
loveClangage
Rank: 8Rank: 8
来 自:广东云浮
等 级:蝙蝠侠
帖 子:326
专家分:891
注 册:2013-8-23
收藏
得分:0 
细节问题,我觉得没必要纠结太多,

编写的程序,不能改变世界,却可以改变自己...
2014-03-05 18:47
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
這個問題根本的原因又是在於不寫直接代碼:scanf("%d", &c),格式符指定的數據類型與實際數據c不符,不寫這種不符合的代碼,就不會出現這種奇異現象,無需考究底層原因,不同環境中有不同的可能,故稱這是陷阱。書中應該都一直在强調寫直接代碼,舉這種例子,也是爲了告誡讀者爲什麽要强調寫直接代碼。其實C程序員喜歡玩各種稀奇古怪的轉換就是一種陋習,《陷阱》說這個是陷阱,而在C++編程規範中也明確不要玩這種手段,諸如隨意使用强制類型之類即是如此,C++故意設計一種繁瑣的數據類型轉換語法,也是這個原因,迫使你再三想清楚是不是真要這樣,如果連那麽繁瑣的用法也用了,祇能是自己明知結果而故意的,不像C那樣可能是無意的。

[ 本帖最后由 TonyDeng 于 2014-3-5 20:47 编辑 ]

授人以渔,不授人以鱼。
2014-03-05 20:37
快速回复:关于《C陷阱》中不明白的部分,求指教!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021085 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved