为什么这个循环在 C 中变成无限循环?

Why this loop become infinite loop in C?

在此代码中,我使用的是 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

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

printf 显示负数这一事实是 未定义行为 对无符号类型使用不正确的格式说明符的表现。

一个unsigned数总是大于或等于0。

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

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

无符号数总是大于或等于 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);
    }
}

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

int y = 0;

或将您的 for 修改为 do while

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