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 *pis0x20または再度ループの先頭に移動します。したがって、無限にループする理由がわかりません。または、ステートメントがどのように機能し、C プログラミング言語で機能するかが本当にわかりません。\np++gotolabels

4

3 に答える 3

5

すると、 for ループが最初からやり直されるため、 は実行されませんgoto topp++それからまたあなた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++ が実行されないためです。ラベルを使用する代わりに続行すると、1 回の完全な反復としてカウントされます。

于 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);
    }
}

go toはループを再開することを意味するため、p ++;beforeを使用する必要があります。goto top;top:

于 2012-12-15T05:06:53.873 に答える