0

考虑以下代码:

const char *s = "a   b    c  d !";
const char *p = s;

top:for(; *p; p++) {
    switch(*p) {
    case 0x20: 
    case '\n': 
        goto top;
    default: 
        putchar(*p);
    }
}

有人可以解释为什么它进入无限循环而不是在何时*p停止NULL?我想到了以下几点:when *pis 0x20or \ngo to the beginning of the loop again,因为它测试条件并评估表达式p++。所以,我看不出它无限循环的理由,或者我真的不明白 C 编程语言中的goto语句和labels工作方式。

4

3 回答 3

5

当你goto top,p++不被执行,因为 for 循环又从头开始了。然后你goto top再来。然后再一次。然后再一次。永远。

如果您希望增量起作用,请使用continue而不是goto. 或者,更好的是,做一些更清晰的事情:

for(p = s; *p != '\0'; p++) {
    switch(*p) {
    case 0x20:
    case '\n':
        // Do nothing.
        break;

    default: 
        putchar(*p);
    }
}

哦,顺便说一句,避免goto像瘟疫这样的陈述。除非您以自动方式生成 C 代码并且它不应该是人类可读的,否则goto实际上这绝不是一个好主意。

于 2012-12-15T04:07:35.087 回答
1

做这个

const char *s = "a   b    c  d !";
const char *p = s;

 for(; *p; p++) {
    switch(*p) {
    case 0x20: case '\n': continue;
    default: putchar(*p);
    }
  }

原因是,您的代码甚至没有完成一次迭代,因此 p++ 永远不会执行。当您继续而不是使用标签时,它计为一次完整的迭代。

于 2012-12-15T04:11:21.430 回答
0
const char *s = "a   b    c  d !";
const char *p = s;

top:
for(; *p; p++) {
    switch(*p) {
    case 0x20: 
    case '\n': 
        p ++;
        goto top;
    default: 
        putchar(*p);
    }
}

您必须使用p ++;before goto top;,因为 go totop:意味着您正在重新启动循环。

于 2012-12-15T05:06:53.873 回答