【问题标题】:Why this loop become infinite loop in C? [duplicate]为什么这个循环在 C 中变成无限循环? [复制]
【发布时间】:2016-03-08 02:19:54
【问题描述】:

在这段代码中,我使用的是 unsigned int,并希望在循环到达“0”时立即终止循环。但这永远不会发生它通过'0'

#include <stdio.h>
typedef unsigned int uint32_t ;

delay (uint32_t x){
    uint32_t y = 0;
    for(y=x; y>= 0; y--){
         printf("Display number %d\n", y);
    }
}

int main()
{
    uint32_t times = 10;

    printf("Hello World!\n");
    delay(10);
    return 0;
}

输出:

Hello World!
Display number 10
Display number 9
Display number 8
Display number 7
Display number 6
Display number 5
Display number 4
Display number 3
Display number 2
Display number 1
Display number 0
Display number -1
Display number -2
Display number -3
Display number -4
Display number -5
Display number -6

Link: For code from: code.hackerearth.com

【问题讨论】:

  • 它会一直持续到y 变为负数。 y 是无符号的,所以它不能变成负数
  • y 是 un unsigned 整数 (uint32_t) 所以它总是 &gt;= 0。所以uint32_t y = 0; for(y=x; y&gt;= 0; y--) 是一个无限循环。

标签: c unsigned unsigned-integer


【解决方案1】:

考虑 for(y=x; y&gt;= 0; y--){ y 永远不能低于 0,因为它是无符号类型。一旦 y 为 0,y--环绕std::numeric_limits&lt;uint32_t&gt;::max()。所以for 循环永远不会终止。

printf 显示否定的事实是未定义行为的表现,因为您对无符号类型使用了不正确的格式说明符。

【讨论】:

  • 是的,我现在知道问题所在,是 %d 误导了我,谢谢 :-)
【解决方案2】:

unsigned 数字将始终大于或等于 0。

你的编译器应该警告你这个错误。

您在输出中看到负数的原因是您正在使用 %d 打印无符号数。

【讨论】:

  • 感谢您的回答:-)
【解决方案3】:

无符号数总是大于或等于 0。

改变这个

delay (uint32_t x){
    uint32_t y = 0;
    for(y=x; y>= 0; y--){
         printf("Display number %d\n", y);
    }
}

delay (uint32_t x){
    int y = 0;
    for(y=(int)x; y>= 0; y--){
         printf("Display number %d\n", y);
    }
}

【讨论】:

    【解决方案4】:

    y无符号,因此它永远不会是负数。您可以将其定义为int

    int y = 0;
    

    或将您的 for 修改为 do while

    y = x;
    do {
         printf("Display number %d\n", y);
    } while (--y >= 0);
    

    【讨论】:

    • 我喜欢第二个想法,但是由于格式说明符不正确,OP需要修复UB。
    猜你喜欢
    • 1970-01-01
    • 2013-04-25
    • 2017-09-21
    • 2015-12-24
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 2020-08-08
    • 2016-07-27
    相关资源
    最近更新 更多