为什么这个循环在 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
考虑 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);
}
}
y
是 unsigned,因此它永远不会是负数。您可以将其定义为 int
int y = 0;
或将您的 for
修改为 do
while
y = x;
do {
printf("Display number %d\n", y);
} while (--y >= 0);
在此代码中,我使用的是 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
考虑 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);
}
}
y
是 unsigned,因此它永远不会是负数。您可以将其定义为 int
int y = 0;
或将您的 for
修改为 do
while
y = x;
do {
printf("Display number %d\n", y);
} while (--y >= 0);