标题:求助,The C programing language书中的两点疑惑(getword函数和折半查找)
只看楼主
giggsxbr
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2011-9-27
得分:0 
以下是引用lz1091914999在2012-1-6 16:30:43的发言:

事实就是这样,这本并不是入门学者看的,参考一下这个:
http://list.


这本书排第一呀。。

话说,这本书为啥不适合初学者?
2012-01-06 16:36
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
得分:0 
1、呵呵,你可能理解有误,word是一个字符数组,类型是char*,所以word必需是char*,而w是一个复本而以,w和word都指向用户传入的这个数组首地址,因为最后需要返回这个数组的第一个元素,所以备份是当然的。
2、写库代码的人也不一定都是最好的,Java类库的正则表达式包里有一个类"Matcher",它是一个正则表达式的匹配器,里面有一个方法叫做,lookingAt(),它的功能是从输入序列和模式的开始匹配部分或全部,但是lookingAt这样不直观的方法名出现了,也就是说不能从名字看出这个方法功能的大概,对于Java这一个对名字有高度要求的语言来说,这样的错误,还是挺蛋疼的,而且这个方法的名字现在都还没有换掉,原因就是拖得太久了,已经有太多的程序员用过这个方法,如果更换,就必须叫所有用过这个方法的程序员改他们的源代码。取这样不直观名字的程序员曾经也在Sun工作,可以想象一下。。。
3、The C Programming language排名第一的原因有几个:
1、这个C语言之父写的(C语言之父有两个)。
2、有一位已经去世。
3、Professional C Programmer 必备。

My life is brilliant
2012-01-06 16:59
giggsxbr
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2011-9-27
得分:0 
以下是引用lz1091914999在2012-1-6 16:59:33的发言:

1、呵呵,你可能理解有误,word是一个字符数组,类型是char*,所以word必需是char*,而w是一个复本而以,w和word都指向用户传入的这个数组首地址,因为最后需要返回这个数组的第一个元素,所以备份是当然的。
2、写库代码的人也不一定都是最好的,Java类库的正则表达式包里有一个类"Matcher",它是一个正则表达式的匹配器,里面有一个方法叫做,lookingAt(),它的功能是从输入序列和模式的开始匹配部分或全部,但是lookingAt这样不直观的方法名出现了,也就是说不能从名字看出这个方法功能的大概,对于Java这一个对名字有高度要求的语言来说,这样的错误,还是挺蛋疼的,而且这个方法的名字现在都还没有换掉,原因就是拖得太久了,已经有太多的程序员用过这个方法,如果更换,就必须叫所有用过这个方法的程序员改他们的源代码。取这样不直观名字的程序员曾经也在Sun工作,可以想象一下。。。
3、The C Programming language排名第一的原因有几个:
1、这个C语言之父写的(C语言之父有两个)。
2、有一位已经去世。
3、Professional C Programmer 必备。


灰常感谢你耐心的解答,嘿嘿

第一个问题我算是明白了,因为如果不备份指针的话,指针已经移到后面去,不好返回第一个元素了,呵呵

不过我依然不是很明白为什么那本书不适合初学者,是因为有些基础知识没有讲到吗,还是什么原因?(这本书我看了两遍了,感觉也不是很难懂啊,呵呵)
2012-01-06 19:25
giggsxbr
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2011-9-27
得分:0 
以下是引用lz1091914999在2012-1-6 16:59:33的发言:

1、呵呵,你可能理解有误,word是一个字符数组,类型是char*,所以word必需是char*,而w是一个复本而以,w和word都指向用户传入的这个数组首地址,因为最后需要返回这个数组的第一个元素,所以备份是当然的。
2、写库代码的人也不一定都是最好的,Java类库的正则表达式包里有一个类"Matcher",它是一个正则表达式的匹配器,里面有一个方法叫做,lookingAt(),它的功能是从输入序列和模式的开始匹配部分或全部,但是lookingAt这样不直观的方法名出现了,也就是说不能从名字看出这个方法功能的大概,对于Java这一个对名字有高度要求的语言来说,这样的错误,还是挺蛋疼的,而且这个方法的名字现在都还没有换掉,原因就是拖得太久了,已经有太多的程序员用过这个方法,如果更换,就必须叫所有用过这个方法的程序员改他们的源代码。取这样不直观名字的程序员曾经也在Sun工作,可以想象一下。。。
3、The C Programming language排名第一的原因有几个:
1、这个C语言之父写的(C语言之父有两个)。
2、有一位已经去世。
3、Professional C Programmer 必备。


其实第二个问题,我主要是不明白作者想表达的意思。

“对算法的最重要修改在于,要确保不会产生非法的指针,或者是试图访问数组范围之外的元素。问题在于,&tab[-1]和&tab[n]都超出了数组tab的范围。前者是绝对非法的,而对后者的间接引用也是非法的。但是,C语言的定义保证数组末尾之后的第一个元素(即&tab[n])的指针运算可以正确执行。”

作者煞费苦心说了这么一大段话,还把本来看起来挺顺眼也挺符合正常思维的代码改动成了怎么看怎么别扭的样子。可是如果把low、high分别声明成&tab[0]和&tab[n-1],怎么可能出现越界呢?仅仅是因为“>=”的效率低于“>”?(也没再哪里看到过>=的效率比>低啊,呵呵)
2012-01-06 19:34
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
得分:0 
回复 13楼 giggsxbr
如果你具有悟性,那是再好不过,但是这本书还是不够深入,想要了解更多的东西还得去看看一本很厚的书才行呢。

My life is brilliant
2012-01-06 19:37
giggsxbr
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2011-9-27
得分:0 
以下是引用lz1091914999在2012-1-6 19:37:53的发言:

如果你具有悟性,那是再好不过,但是这本书还是不够深入,想要了解更多的东西还得去看看一本很厚的书才行呢。


呵呵,只是想入门,应付应付面试而已~
2012-01-06 19:42
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
得分:0 
...

[ 本帖最后由 lz1091914999 于 2012-1-6 20:25 编辑 ]

My life is brilliant
2012-01-06 20:22
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
得分:0 
程序代码:
#include <stdio.h>
#include <string.h>

void f1(const char* beg, const char* end) {
   while (beg <= end)
      putchar(*beg++);
}

void f2(const char* beg, const char* end) {
   while (beg < end)
      putchar(*beg++);
}

int main(void) {
   const char* cpp = "C Plus Plus";
   int length = strlen(cpp); /* 11 */

   f1(cpp, &cpp[length - 1]); /* f1(&cpp[0], &cpp[length - 1]); */
                              /* f1(&cpp[0], cpp + length - 1); */
                              /* f1(cpp, cpp + length - 1); */
   printf("\n");
   f2(cpp, &cpp[length]);     /* f2(&cpp[0], &cpp[length]); */
                              /* f2(&cpp[0], cpp + length); */
                              /* f2(cpp, cpp + length) */
}

My life is brilliant
2012-01-06 20:23
dingfa
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2014-11-3
得分:0 
无意间看到这个帖子,挖个坟:

1.函数最后一句, return word[0]; 这里定义一个w指针是为了在自加的时候有备份,不至于破坏传进来的参数;函数本身不会备份word的拷贝。需要程序自己实现。
2.这么写可以支持参数n为0的情形。
2014-11-03 17:24



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-359258-1-1.html




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

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