unix goto命令源代码

时间:2014-12-31 17:15:09

标签: c shell unix

以下是历史Unix goto.c的源代码:http://v6shell.org/history/goto.c

所以我们正试图找到一个匹配的标签来记录" goto标签"调用

我的问题:

if (getlin(line)) {
        write(1, "label not found\n", 16);
        return;
        }

所以我希望如果getlin()返回true,我们应该打印出#34;标签未找到"并退出程序。

但是看看这个:

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)){}

这里有什么问题?

1 个答案:

答案 0 :(得分:3)

{p> 0false中被视为C。因此混乱。您可以通过运行这个小代码示例来试用:

#include <stdio.h>

int i = 0;

int main() {
  if(i) {
    printf("i is %d and it is true\n", i);
  } else {
    printf("i is %d and it is false\n", i);
  }
  return 0;
}

作为退出代码,0被视为成功。但在条件句中(C),0评估为false1评估为true

但是,在bash中,0被视为true,即使是在条件限制中。这是因为在bash的大多数用例中它更方便,因为我们总是处理进程。