这是下面显示的一小段代码,它使用do while循环。 我真的不明白我执行此代码时看到的意外行为。下面显示的代码使用do while循环条件,据我所知,while循环执行的方式是,如果首先执行语句然后检查while部分,如果条件是真的。但是当我执行这个代码时,它永远不会出现循环并永远继续。任何人都可以告诉我为什么会发生这种情况?
unsigned int A = 5;
int B = 0;
main()
{
do
{
A = A + 5;
B = B - 1;
}while(B > A);
printf("hello\n");
}
现在我从未打印过“你好”。
提前致谢 麦迪
答案 0 :(得分:4)
正如其他答案所说,比较有符号和无符号值是一个坏主意(如果给出正确的标志,GCC会发出警告)。您陷入“无限循环”的原因是签名值B
被视为无符号以进行比较。第一次到达while(B > A)
时,B
为-1(它从0开始并递减一次)。当被视为无符号时,它将成为最大可能的整数,因此比较为真。它很长一段时间都是如此,所以循环似乎永远不会结束。最终递增A
并递减B
将导致它们相互传递并且循环将结束,但它将花费比您预期更长的时间
答案 1 :(得分:1)
您将unsigned int与负数进行比较。尝试将A转换为有符号的int。
答案 2 :(得分:1)
比较已签名和未签名可能会导致令人困惑的行为。您应该将A
和B
设为同一类型。
答案 3 :(得分:0)
您正在使用unsigned进行比较。但你最终会看到“你好”。因为A和B都会溢出以使B>是的。
答案 4 :(得分:-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