【发布时间】:2014-12-31 17:15:08
【问题描述】:
这是一个历史悠久的 Unix goto.c 的源代码:http://v6shell.org/history/goto.c
所以我们试图找到一个记录“goto label”调用的匹配标签。
我的问题:
if (getlin(line)) {
write(1, "label not found\n", 16);
return;
}
所以我希望如果 getlin() 返回 true,我们应该打印出“未找到标签”并退出程序。
但是看看这个:
getlin(s)
char s[];
{
int ch, i;
i = 0;
l:
if ((ch=getc())=='\0') return(1);
if (ch!=':') {
while(ch!='\n' && ch!='\0')
ch = getc();
goto l;
}
while ((ch=getc())==' ');
while (ch!=' ' && ch!='\n' && ch!='\0') {
s[i++] = ch;
ch = getc();
}
while(ch != '\n')
ch = getc();
s[i] = '\0';
return(0);
}
如果我们找到标签,getlin() 将返回 0(true),如果没有找到,则返回 1(false)。
但它应该是相反的,否则我们需要说:
if (**!** getlin(line)){}
这里有什么问题?
【问题讨论】:
-
不确定这是怎么回事,但作为一般经验法则:unix 实用程序传统上返回 0(零)表示成功,其他一切都表示错误(错误代码)。所以我说函数实现是有道理的,条件是有问题的。
-
是的,这就是问题所在。但它有效,那为什么有效呢?