以下程序被称为进入无限循环:
#include<stdio.h>
int main()
{
int n;
for(n = 7; n!=0; n--)
printf("n = %d", n--);
getchar();
return 0;
}
在分析时,我确实发现n的值确实变为0,然后循环应该终止。 会不会发生这样的情况,即当它第一次进入循环时,该值为7,然后变为6,并且由于每次迭代有2个后减量? 但是,为什么不发生这种情况?
答案 0 :(得分:3)
每个循环迭代实际上将n
减少2,并且比较n != 0
总是看到i
的奇数,因此永远不会终止。
尤其是,恰好在所涉及的迭代之前,循环头中的n首先被n--
递减为1(因为这必须发生在前一次迭代结束之后,即条件{{ 1}})。
然后,评估n!=0
,打印printf("n = %d", n--);
,同时 post 将n = 1
递减为零。在循环主体结束之后,在评估条件n
以确定循环是否应该继续之前,循环头中的n再次减n--
,使其为-1。
结果是,每次n!=0
都为真(特别是,因为n必须先完成n!=0
,所以循环n中的n--
不会立即被评估)
答案 1 :(得分:1)
这是因为此处打印的第二个减量:
for(n = 7; n!=0; n--)
printf("n = %d", n--);
这使得对n进行检查的顺序为7、5、3、1,-1,...。一个int的值是偶数,因此这将在下溢时形成一个循环,从而排除偶数,包括0。
请记住,for循环条件是在每次循环迭代之前以及循环本身递减之后进行求值的。循环运行时未经测试。
答案 2 :(得分:0)
尝试这样做
#include<stdio.h>
int main()
{
int n;
for(n = 7; n>=0; n--)
printf("n = %d", **--n**);
getchar();
return 0;
}