使用do while循环在代码中产生怀疑

时间:2010-06-22 05:14:48

标签: c do-while

这是下面显示的一小段代码,它使用do while循环。 我真的不明白我执行此代码时看到的意外行为。下面显示的代码使用do while循环条件,据我所知,while循环执行的方式是,如果首先执行语句然后检查while部分,如果条件是真的。但是当我执行这个代码时,它永远不会出现循环并永远继续。任何人都可以告诉我为什么会发生这种情况?

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

           printf("hello\n");
          }

现在我从未打印过“你好”。

提前致谢 麦迪

5 个答案:

答案 0 :(得分:4)

正如其他答案所说,比较有符号和无符号值是一个坏主意(如果给出正确的标志,GCC会发出警告)。您陷入“无限循环”的原因是签名值B被视为无符号以进行比较。第一次到达while(B > A)时,B为-1(它从0开始并递减一次)。当被视为无符号时,它将成为最大可能的整数,因此比较为真。它很长一段时间都是如此,所以循环似乎永远不会结束。最终递增A并递减B将导致它们相互传递并且循环将结束,但它将花费比您预期更长的时间

答案 1 :(得分:1)

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

答案 2 :(得分:1)

比较已签名和未签名可能会导致令人困惑的行为。您应该将AB设为同一类型。

答案 3 :(得分:0)

您正在使用unsigned进行比较。但你最终会看到“你好”。因为A和B都会溢出以使B>是的。

答案 4 :(得分:-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