2

while以下に示すループの状態を理解するのにいくつかの困難があります。

int main()
{
    char s[]="Let's Get it Started";
    int i=0;
    while(s[i]!=0)
    { 
       //do something
       ++i

    }
}

\0文字列は、ASCII 値がの最後の文字で保存されることを知っています0whileループでは、配列の特定の文字の値を比較しています。したがって、\0条件に達すると次のようになります

'\0' != 0 // I guess this is also true

これは無限ループではありませんか?

4

3 に答える 3

4

ではC'\0'は と同じ値 (さらには型) を持ちます0。どちらも値intを持つです。0

これは無限ループではありませんか?

\0したがって、と0が異なるという仮定のため、無限ループではありません。ただし、この質問の範囲外の他の要因については、ループが無限になる可能性があります。

C11仕様セクション5.2.1/2 文字セットから

null 文字と呼ばれる、すべてのビットが 0 に設定されたバイトは、基本実行文字セットに存在する必要があります。文字列を終了するために使用されます。

于 2015-06-11T05:49:40.193 に答える
1

アスキー文字「0」と「\0」を少し混同しているようです。最初の 1 つは ASCII 文字 '0' で、ASCII テーブルによると同等の番号 (48) があります。しかし、ゼロ '\0' の前にエスケープ バーを使用すると、ヌル文字 (ヌル番号とは異なります) を使用していることになります。したがって、すべてのビットがゼロに設定された ASCII 文字は、数字の 0 と同じです。

したがって、これは無限ループではありません。最後のヌル文字を比較すると、0 に等しいからです。

于 2015-06-11T07:10:24.443 に答える
1

たぶん、あなたはエラーに陥ったでしょう。ASCII テーブルをシークできます'\0'-->0, '0'-->48

あなたのコードでwhile(s[i] != 0)は、0intではなくcharです'\0' == 0 is true

ちなみに、以下のコードを書くことができます:

int a = '\0';
int b = '0';
printf("%d  %d\n", a, b);

問題点が明確にわかると思います。したがって、無限ループではありません。

于 2015-06-11T07:01:09.743 に答える