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 开始并递减一次)。当被视为无符号时,它成为可能的最大整数,因此比较为真。它在很长一段时间内都是正确的,因此循环似乎永远不会结束。最终递增A和递减B会导致它们相互传递,循环将结束,但它需要的时间比你预期的要长

于 2010-06-22T05:23:56.510 回答
1

您正在将 unsigned int 与负数进行比较。尝试将 A 转换为有符号整数。

于 2010-06-22T05:18:03.083 回答
1

比较有符号和无符号可能会导致令人困惑的行为。您应该同时制作A相同B的类型。

于 2010-06-22T05:18:04.400 回答
0

您正在比较有符号和无符号。但你最终会看到“你好”。因为 A 和 B 都会溢出以使 B > A 为假。

于 2010-06-22T05:24:07.210 回答
-1

为我打印“你好”。需要一段时间(嗯,一两秒)。

修改成这个...

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 回答