求助,The C programing language书中的两点疑惑(getword函数和折半查找)
我看的是第二版,中文版。第一个疑问:
书的118页,getword函数是从输入中读取下一个单词,ungetch函数在书的前面章节,是为了把某个字符存放在缓冲区,避免丢失
程序代码:
int getword(char *word, int lim) { int c, getch(void); void ungetch(int); char *w = word; while (isspace(c = getch())) ; if (c != EOF) *w++ = c; if (!isalpha(c)) { *w = '\0'; return c; } for ( ; --lim; w++) if (!isalnum(*w = getch())) { ungetch(*w); break; } *W = '\0'; return word[0]; }
可为什么要声明一个指针w呢?看起来毫无必要啊,函数本来就是会生成参数word的一个拷贝不是吗?
第二个疑问:
120页,那个折半查找的函数
程序代码:
struct key *binsearch(char *word, struct key *tab, int n) { int cond; struct key *low = &tab[0]; struct key *high = &tab[n]; struct key *mid; while (low < high) { mid = low + (high - low) / 2; if ((cond = strcmp(word, mid->word)) < 0) high = mid; else if (cond > 0) low = mid + 1; else return mid; } return NULL; }
为什么不用117页利用数组下标那种比较方式,这样写代码呢:
程序代码:
struct key *binsearch(char *word, struct key *tab, int n) { int cond; struct key *low = &tab[0]; struct key *high = &tab[n - 1]; struct key *mid; while (low <= high) { mid = low + (high - low) / 2; if ((cond = strcmp(word, mid->word)) < 0) high = mid - 1; else if (cond > 0) low = mid + 1; else return mid; } return NULL; }
我看了标准库里的函数,也用的是“<=”进行比较,并且在相应分支里给high赋值成mid-1
效果看起来是一样的,但我感觉这本书里这样别扭的比较是别有用意的,因为下面有一段话专门解释(正是这段解释让我一头雾水):tab[n]虽然越界,但是对它进行取地址是合法的操作。