c语言入门:[14]while循环
上节我们学习的goto个人认为是初学者最好理解的循环语句,使用起来也很方便,goto语句使用起来非常灵活,但是就是因为太灵活了所以许多有编程的人都觉得goto往往会使程序难于阅读造成逻辑混乱,有的时候写代码多了一会跳转到这一会跳转到那往往会把编程者自己都搞糊涂了更别说别人了,还有一点就是在c基础上发展起来的c#和java编程语言里不支持goto,所以我们还是要学习能够替代goto的其它循环的写法,这节我们来学习while循环,while循环有两种形式下面分别作介绍。
while循环的第一种形式:
上节goto的例子如果用while写就是这样。
int main()
{
int i=0;
printf("一个循环语句的例子\n");
do
{
printf("*");
i=i+1;
}while(i<10);//注意这里必须写分号
printf("hello\n");
}
对比上节的goto我们可以这样认为:
1>do相当于原来的标记,用来表示循环开始的地方,只不过这个是c语言里的关键字不能自己随便起了只能用do,另外do后面也不要加冒号。
2>while(i<10);是循环的判断,相当于goto里的if判断,如果条件为真转到do的位置重复执行,条件为假则循环终止。
3>用大括号括起来的部分是要重复执行的代码,这个大括号不能省略。为了叙述方便以后我们管这部分代码就叫循环体。
4>while(i<10);必须加分号,来表示语句结束。当你看到while的第二种写法时你就会知道如果不加分号那while(i<10) printf("hello\n");也能构成一个循环,所以为了避免歧义要求第一种写法的循环条件后必须加分号。
我们可以看到对比goto,这样写更简洁明了,结构清晰。
while循环的第二种形式:
此种形式是在第一种形式的基础上进一步简化,省略了do,上面的例子用这种形式写法如下:
int main()
{
int i=0;
printf("一个循环语句的例子\n");
while(i<10)
{
printf("*");
i=i+1;
}
printf("hello\n");
}
要点解析:
1>此种写法就跟if语句的写法类似,大括号可以省略,如果不写大括号那循环体就是while后面的第一条语句,你如果在while(i<10)后面直接加分号也可以,那样循环体就为空。
2>while(i<10)不是判断一次就拉倒,而是循环重复判断,每次判断只要条件为真就执行一次循环体。什么时候判断为假了while语句就结束,循环终止。像这个例子循环体被重复执行了10次而i<10这个条件却判断了11次,正是因为第11次判断结果为假循环才终止了。
while的这两种写法是有区别的
第一种写法是:先执行一遍循环体,然后再判断
第二种写法是:先判断,条件不符合则直接退出,循环体可能一次都不被执行
用第一种写法写的程序都能修改成第二种写法的形式。
通过下面的两个例子来讲解下
例题1:不停地从键盘输入字符直到输入q结束。
char ch;//用来存储每次从键盘输入的字符
scanf("%c",&ch);//重复执行这句话能够实现“不停地从键盘输入字符”的要求,而第一个字符总是要输入的,也就是说这句话至少要执行一遍,适合do while
int main()
{
char ch;
do
{
scanf("%c",&ch);
}while(ch!='q'); //只要输入的不是q就循环,重复执行 scanf("%c",&ch);
}
运行这个例子当你从键盘输入字符的时候最好输入一个一回车,如下图。
如果用第二种写法改写,我们就可以给ch一个初始值让第一次循环判断肯定成立,这样 scanf("%c",&ch);就至少会执行一次
int main()
{
char ch='a';
while(ch!='q')
{
scanf("%c",&ch);
}
}
第一次判断ch!='q'肯定为真,因为ch里初始存放的是'a'这个字符,所以 scanf("%c",&ch);得到执行,ch里的值变成了运行程序的人从键盘上输入的一个字符
第二次判断ch!='q' 结果就不一定了,因为我们也不知道ch里存储的是什么,这要看运行程序的人从键盘输入了什么字符。
很显然这种改写的方式没有第一种写法好懂,而且写起来还费事。
例题2:从键盘输入一个自然数,输入几就输出几个星号。
分析下问题,如果我们输入的是0,那一个星号都不输出,所以我们需要先判断,这种情况就适合用第二种写法。
int main()
{
int i=0;
int n;//表示从键盘输入的整数
printf("请输入一个自然数:");
scanf("%d",&n);
while(i
{
printf("*");
i=i+1;
}
printf("\n");
}