【问题标题】:Doubts in a code using do while loop使用 do while 循环的代码中的疑问
【发布时间】:2011-03-06 15:35:08
【问题描述】:

这是下面显示的一小段代码,它使用了 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");
          }

现在我从来没有打印出“你好”。

提前致谢 麦迪

【问题讨论】:

    标签: c do-while


    【解决方案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
    

    【讨论】:

    • 非常感谢大家。花费的时间比预期的要长,但最终打印出了“hello”。
    【解决方案2】:

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

    【讨论】:

    • 不需要,可以正常互相传递(B从MAX_UINT递减,A从0递增)
    【解决方案3】:

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

    【讨论】:

    • @Michael...感谢您的解决方案,但我有点困惑的是,当转换为无符号数时,有符号数 -1 为何会成为最大整数?我的意思是转换完成了吗?
    • @maddy - 在两个补码算术中,有符号值 -1 的位模式全为 1。如果您将该位模式解释为无符号,它将是可表示的最大值。
    • @maddy 一般负数以two's complement的格式存储;碰巧以这种形式 -1 存储为 0xFFFFFFFF (在 32 位机器上)。作为一个无符号数,这是可能的最大数
    • 非常感谢塞缪尔和迈克尔。
    【解决方案4】:

    比较有符号和无符号可能会导致令人困惑的行为。您应该将AB 设为同一类型。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-27
        • 1970-01-01
        相关资源
        最近更新 更多