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

时间:2015-12-03 12:48:19

标签: c unsigned unsigned-integer

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

4 个答案:

答案 0 :(得分:2)

unsigned号码将始终大于或等于0.

您的编译器应警告您此错误。

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

答案 1 :(得分:1)

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

for显示否定的事实是对使用无符号类型的错误格式说明符时未定义行为的表现。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

y 未签名,因此永远不会是否定的。您可以将其定义为int

int y = 0;

或将您的for修改为do while

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