c语言学习(while)中自己遇到的陷阱

在看书时,似乎看到这个陷阱,但直到自己遇到,确实感觉可怕。

我先贴出错误代码:


/* 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;
}

     



这些运行结果是预想的那样,在一小会儿 之后出现了“done”.然后窗口瞬间关闭。结果如下图



会发现更改的代码,不论从哪观察首先在内层循环要避免while(i--);之类的表达,要有明确的终止条件。因为外层没问题的,但不代表内层也同样。

我们通常从最简单的代码如下

.............
i= 10;
while(i--)
{
   [expression];
}
可以多次执行语句并且正常运行,但是不能保证这样的表达在数层循环内也这样。


在写这个博文时,在写的时候不断的看代码,发现其实自己的错误代码其实错误蛮多的。

1.在像“while”这样的块程序中是最好用上“{}”,圈出"while"下执行的语句。避免因为粗心,“while”下只执行一条语句。


总结:

  在各种平台了解到,写博客能提高自己,今天试了下确实如此。

  


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值