在看书时,似乎看到这个陷阱,但直到自己遇到,确实感觉可怕。
我先贴出错误代码:
/* count.c ----简单的计数程序*/
#include< stdio.h>
#define SIZE 10000
int main(void)
{
int i = SIZE;
int j = SIZE;
/*开始进行计数*/
while( j--)
while( i--)
;
/*计数完,进行提示*/
printf("done");
return 0;
}
运行结果:就是下面的框框一直出现,没有预料的隔一会出现 “done”.
然后我分析,这个可能哪出错了,通过打印 " 变量 i 和 j 的值变化,我似乎发现了点甚么”
/* count.c ----简单的计数程序*/
#include< stdio.h>
#define SIZE 10000
int main(void)
{
int i = SIZE;
int j = SIZE;
/*开始进行计数*/
while( j--)
{
printf("%d\n", j);
while( i--)
printf("i=%d\n",i);
}
/*计数完,进行提示*/
printf("done");
return 0;
}
运行结果是:下图,结果发现“i”的值竟然变成这样。
所以问题找到了,是第二层循环变成了死循环,看似有条件限制的,结果变成了这样的死循环。
更改后的代码有这样几个版本
1
/* count.c ----简单的计数程序*/
#include< stdio.h>
#define SIZE 10000
int main(void)
{
int i = SIZE;
int j = SIZE;
/*开始进行计数*/
while( j--)
{
while( i-- > 0)
{
;
}
}
/*计数完,进行提示*/
printf("done");
return 0;
}
2
/* count.c ----简单的计数程序*/
#include< stdio.h>
#define SIZE 100000
int main(void)
{
int i = SIZE;
int j = SIZE;
/*开始进行计数*/
while( j>0)
{
while( i > 0)
{
i--;
}
j--;
}
/*计数完,进行提示*/
printf("done");
getchar();
return 0;
}
3
/* count.c ----简单的计数程序*/
#include< stdio.h>
#define SIZE 100000
int main(void)
{
int i = SIZE;
int j = SIZE;
/*开始进行计数*/
while( j-->0)
{
while( i-- > 0)
{
;
}
}
/*计数完,进行提示*/
printf("done");
getchar();
return 0;
}
会发现更改的代码,不论从哪观察首先在内层循环要避免while(i--);之类的表达,要有明确的终止条件。因为外层没问题的,但不代表内层也同样。
我们通常从最简单的代码如下
.............
i= 10;
while(i--)
{
[expression];
}
可以多次执行语句并且正常运行,但是不能保证这样的表达在数层循环内也这样。
在写这个博文时,在写的时候不断的看代码,发现其实自己的错误代码其实错误蛮多的。
1.在像“while”这样的块程序中是最好用上“{}”,圈出"while"下执行的语句。避免因为粗心,“while”下只执行一条语句。
总结:
在各种平台了解到,写博客能提高自己,今天试了下确实如此。