| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 842 人关注过本帖
标题:发掘了 C Primer Plus书中的几处个人认为的错误!
只看楼主 加入收藏
wengege
Rank: 2
等 级:论坛游民
帖 子:148
专家分:93
注 册:2012-7-23
结帖率:89.47%
收藏
 问题点数:0 回复次数:9 
发掘了 C Primer Plus书中的几处个人认为的错误!
很久之前就听说 C Primer Plus 这本书不错,最近陆陆续续的看了一部分,无意发觉了两处个人认为的错误:
1、如295页    程序清单11.10下面的第三行程序解析: “记住,++ 比*的优先级高。 ” 对C运算符有点印象的可能就知道 ++ 和 *都是单目运算符 属于同等优先级,只是他们的结合方向都是自右向左。

2、如297页介绍 strlen()函数的例程:
void fit(char *string, unsigned int size)
{
    if(strlen(string) > size)
        *(string + size) = '\0';
}
上面程序假如在调用函数里这样调用: fit("abcdefg", 3); 这样会发现程序会修改字符串常量,而这样的结果会导致访问内存错误!
搜索更多相关主题的帖子: 优先级 abcdefg 
2012-10-24 20:04
wengege
Rank: 2
等 级:论坛游民
帖 子:148
专家分:93
注 册:2012-7-23
收藏
得分:0 
继续看这本书, 接下来会把收集的个人认为错误的观点 陆续汇报上来与大家分享!

打好基础,学会站在巨人的肩膀上!
2012-10-24 20:11
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
第一个应是指前缀吧,不过书中应有不要依赖运算符优先级的劝告。
第二个不算是错误,是C语言本身的前提:程序员自己保证不发出错误的调用。

授人以渔,不授人以鱼。
2012-10-24 20:16
wengege
Rank: 2
等 级:论坛游民
帖 子:148
专家分:93
注 册:2012-7-23
收藏
得分:0 
++ 是后缀。
第二题:对于面向初学者的课本,这里很有必要声明的。

打好基础,学会站在巨人的肩膀上!
2012-10-24 20:20
sglhsay
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-11-15
收藏
得分:0 
void fit(char *string, unsigned int size)
 {
     if(strlen(string) > size)
         *(string + size) = '\0';
 }
 我看这个函数不正是用来修改字符串的吗?当字符串参数string的长度大于参数size时则将string从string[size]处阶段,比如string = "abcdef", size = 3时,fit(string, size)的就会将string变成"abc"(实际是变成"'a','b','c','\0','e','f'")。  
 设计这个函数的目的就是用来在一定条件下修改字符串的。
2012-11-15 22:51
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用wengege在2012-10-24 20:04:30的发言:

很久之前就听说 C Primer Plus 这本书不错,最近陆陆续续的看了一部分,无意发觉了两处个人认为的错误:
1、如295页    程序清单11.10下面的第三行程序解析: “记住,++ 比*的优先级高。 ” 对C运算符有点印象的可能就知道 ++ 和 *都是单目运算符 属于同等优先级,只是他们的结合方向都是自右向左。

2、如297页介绍 strlen()函数的例程:
void fit(char *string, unsigned int size)
{
    if(strlen(string) > size)
        *(string + size) = '\0';
}
上面程序假如在调用函数里这样调用: fit("abcdefg", 3); 这样会发现程序会修改字符串常量,而这样的结果会导致访问内存错误!

可以加个高亮大家讨论讨论 第二个函数写的不算好 最起码没错误处理 这是不好的 这个函数不应该是void void函数应该是总是成功 不会失败的 而这个函数不保证能成功 所以罢 算不得好函数
2012-11-16 11:44
wanjiawei
Rank: 4
等 级:业余侠客
帖 子:61
专家分:213
注 册:2012-11-16
收藏
得分:0 
1 :
图片附件: 游客没有浏览图片的权限,请 登录注册

2:
"abcdefg"它的准确类型应该是const char*,由于历史原因也能被char*接收,所以fit("abcdefg", 3); 这段代码好的编译器至少也得给个警告,不过就像T版说的程序员应该为自己调用的函数负责。
2012-11-16 16:31
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
回复 7楼 wanjiawei
说的不错。

My life is brilliant
2012-11-16 16:33
wengege
Rank: 2
等 级:论坛游民
帖 子:148
专家分:93
注 册:2012-7-23
收藏
得分:0 
还不止这些,。。 书上陆续还有其他的。。。

打好基础,学会站在巨人的肩膀上!
2012-11-16 18:42
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用wengege在2012-11-16 18:42:14的发言:

还不止这些,。。 书上陆续还有其他的。。。

书上的是sample code 例子代码 和实际的代码有差别是正常的 你用不同的角度看一段代码 得到的评价是不同的

作为教科书 要看它说的对学习有没有帮助 有没有培养十分不良的编程习惯 有没有明显错误 非要较真 书上的代码没多少好的 这也是为啥很多人说要多读代码尤其是那些著名的开源程序的代码 那些代码才是贴近实际的


[ 本帖最后由 zklhp 于 2012-11-16 18:47 编辑 ]
2012-11-16 18:46
快速回复:发掘了 C Primer Plus书中的几处个人认为的错误!
数据加载中...
 
   



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

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