【发布时间】:2019-10-14 10:37:34
【问题描述】:
在 K&R 的第 6.3 章中,函数 getword() 定义如下:
int getword(char *word, int lim)
{
int c, getch(void);
void ungetch(int);
char *w = words;
while(isspace(c=getch()))
;
if(c!= EOF)
*w++; = c;
if(isalpha(c)) {
*w = '\0';
return c;
}
for(;--lim > 0; w++)
if(!isalnum(*w)getch()){
ungetch(*w);
break;
}
*w = '\0';
return word[0];
}
我不明白该行的语法
int c, getch(void);
这是我第一次看到这个。为什么将函数声明为 int?在调用函数之前插入函数原型还不够吗?
【问题讨论】:
-
K&R 的原始代码完全是垃圾,不会像这样编写现代 C 程序。除了坏习惯,这里没有什么可学的。我强烈建议你买一本更好的书。
-
@Lundin 你能推荐一些适合初学者和高级水平的现代 C 书籍吗?
-
K&R 书和有问题的代码片段都不是“完全垃圾”。 @Lundin 在这里有不合理的偏见。
-
@EsmaeelE Stack Overflow 有一个 book list。
-
@SteveSummit 1) 从来没有理由在函数内部声明原型,2) 特别是与变量不在同一行。 3)控制语句内部的赋值是不好的做法。 4) 将 ++ 与赋值混合在一起是不好的做法。 5) 此处多次返回或中断跳转,无法读取。 6) 没有理由使用
lim作为迭代器而不是(i=0; i<lim; i++),就像在正常代码中所做的那样。 7)*w = '\0';是代码重复。大约 15 个 LoC 中有 7 个问题。摘要:完全垃圾。