1

これは、do while ループを使用している以下に示す小さなコードです。このコードを実行したときに見られる予期しない動作を本当に理解していません。以下に示すこのコードは、do while ループ条件を使用しており、私の知る限り、do while ループは、if 最初にステートメントを実行してから while をチェックインするような方法で実行されます。条件が真かどうかの一部ですが、このコードを実行すると、ループから抜け出すことはなく、永遠に続きます。なぜそれが起こっているのか教えてください。

           unsigned int A = 5;
           int B = 0;
           main()
          {
               do
               {
                   A = A + 5;
                   B = B - 1;
               }while(B > A);

           printf("hello\n");
          }

今、「こんにちは」が印刷されることはありません。

前もってありがとうマディ

4

5 に答える 5

4

他の回答が言うように、符号付きと符号なしの値を比較するのは悪い考えです (正しいフラグが与えられた場合、GCC はそれについて警告します)。「無限ループ」に陥っている理由はB、比較のために符号付きの値が符号なしとして扱われるためです。に初めて到達したwhile(B > A)ときBは -1 です (0 から始まり、1 回減分されました)。符号なしとして扱うと、可能な最大の整数になるため、比較は true になります。それは長い間真のままであるため、ループは決して終わらないように見えます。最終的にインクリメントAとデクリメントBにより、それらは互いにすれ違い、ループは終了しますが、予想よりも時間がかかります

于 2010-06-22T05:23:56.510 に答える
1

unsigned int を負の数と比較しています。A を signed int に変換してみてください。

于 2010-06-22T05:18:03.083 に答える
1

署名されたものと署名されていないものを比較すると、動作が混乱する可能性があります。両方AB同じタイプにする必要があります。

于 2010-06-22T05:18:04.400 に答える
0

符号付きと符号なしを比較しています。しかし、最終的には「こんにちは」が表示されます。A と B の両方がオーバーフローして B > A が false になるためです。

于 2010-06-22T05:24:07.210 に答える
-1

私のために「こんにちは」を出力します。しばらく時間がかかります (まあ、1 秒か 2 秒)。

これに改造…

void main()
{
    unsigned int A = 5;
    unsigned int loop = 0;
    int B = 0;
    do
    {
        A = A + 5;
        B = B - 1;
        loop++; 
    }while(B > A);

    printf("hello %d  %d %d\n", B, A, loop);
}

プリントアウト:-

hello -715827882  -715827881 715827882
于 2010-06-22T05:21:44.500 に答える