大家好,很高兴又和各位见面了,经过前面的探讨,我们以及掌握了分支语句——if语句和switch语句,接下来,我们将要开始进行循环语句内容的探讨啦!!!
(三)循环语句
在C语言中,循环结构的体现就是循环语句。在前面的学习中我们知道了,循环语句就是在满足条件的情况下重复去做一件事,直到不满足条件为止。循环语句分三类:while语句、for语句、do……while语句。今天我们要探讨的是第一种while语句。
while语句
1.语句结构:
在初识C语言11中我们已经探讨过了while语句,细心的朋友就会发现while语句其实跟if语句挺相似的,两者都是先判断条件是否为真,判断为真,则条件下的执行指令,判断为假,则执行条件外的指令,两者的区别是if语句下的指令只执行一次,而while语句下的指令可以重复多次的执行,while语句的结构如下:
//while语句结构
while (表达式)
{
执行语句;
递进语句;
}
while语句的执行流程如下:
从执行流程我们可以看到while语句除了正常判断条件外,还可能存在特殊情况,这里的特殊情况就是指的break和continue这两个关键字,下面我们就来探讨一下这两个关键字在循环语句中的作用。
2.while语句中的break和continue:
break:
在开关语句——switch语句中我们就有介绍到,作为转向语句,它在switch中的作用就是将不同的情况给独立出来,使它们各个情况之间互不干扰。break的含义是停止、打断的意思,它在循环语句中又会起到什么作用呢?接下来我们通过代码来探讨一下:
现在这行代码程序正常执行时能够将数字0~10全部打印出来,如下图所示:
现在我们在其中加入break试一下,这里我们需要嵌套一个if语句,代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
int a = 0;
while (a <= 10)
{
if (a == 5)
{
break;
}
printf("%d\n", a);
a++;
}
return 0;
}
在程序运行前,大家不妨猜测一下,此时的结果又会如何?那废话不多说,我们一起来看看运行结果:
这个结果跟大家推测的结果有出入吗?为什么会是这个结果呢?接下来我们来监视一下程序,前面的过程我相信大家都应该很清楚了,现在我们直接来看关键部分:
此时已经满足了if语句的判定,进入if执行语句break,下面我们继续执行:
这里我们可以看到,当程序走到break之后,下一步程序直接跳出来循环,也就是循环直接被终止了,下面我们在循环外加入一行代码,看看结果又会如何:
此时程序直接从break跳到了循环外的执行语句,从上面的测试结果我们可以得到结论:
break在循环语句中的作用就是终止循环,也就是说在循环语句中,只要遇到break,就停止后期的所有循环内容,直接跳出循环。
接下来我们继续探讨continue在循环中的作用。
continue:
关键字continue——继续,从字面意思我们可以推测它是继续循环的意思,那问题就来了,我就算不要continue,只要不满足条件它也是能继续的呀,为什么还要额外引用一个continue呢?难道它的作用跟我们理解的继续有点出入?话不多说,咱们直接通过代码来探讨一下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
int a = 0;
while (a <= 10)
{
if (a == 5)
{
continue;
}
printf("%d\n", a);
a++;
}
printf("感谢各位吴彦祖刘亦菲观看本文");
return 0;
}
下面在运行前,咱们先推测一下它的结果会是什么?接下来咱们来验证一下自己的推测:
诶!结果跟我自己推测的有点出入,而且从控制台窗口显示,程序并未结束,还在继续执行,为什么会这样呢?我们来监视一下:
现在已经满足条件,进入if语句中,下面继续执行:
哇!不是吧,它并没有像我想象的那样继续执行循环内的语句,反而跳过后面的语句直接进入判定了,这样a的值永远不会发生变化,难怪刚才的结果是程序并未结束,那如果我把a++移动到if语句前,结果又会发生什么样的变化呢?
这里我们看到除了5以外,其它内容都打印了,那说明只有在a=5时,进入continue,然后直接跳过了后面的执行内容回到判断,由此我们可以的出结论:
continue是用于终止本次循环,也就是在本次循环中,continue后面的代码不会执行,或者说是跳过后面的执行语句,直接回到判定部分,进行下一次循环的入口判断。
接下来我们来看几个代码:
//代码1
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)//getchar()——接收字符,相当于scanf("%c", &);
//EOF——end of file——文件结束标志,值为-1;
{
putchar(ch);//putchar()——输出字符,相当于printf("%c", );
}
return 0;
}
//代码2
int main()
{
char ch = '\0';
while ((ch = getchar()) != EOF)
{
if (ch < '0' || ch>'9')
{
continue;
}
putchar(ch);
}
return 0;
}
下面我们先认识一下这些代码及其含义:
getchar——接收字符,也就是我们自己输入字符,它会将输入的字符存起来,相当于scanf函数,如图所示;
程序运行后我们可以看到,窗口此时是需要我们输入内容的,和scanf函数一样,这时我们输入字符a;
putchar——输出字符,也就是在屏幕上将字符打印出来,相当于printf函数,如图所示;
在我们输入字符a后输出的结果为两个a,第二个a是printf打印出来的,第1个a只能是putchar打印出来的了。这里我们进一步证实了getchar和putchar的功能;
EOF——文件结束标志,是end of file的首字母大写,相当于\0,但是两者还是有些区别它本身的值为-1,如下图所示;
我们将EOF的值打印出来看一下:
可以看到\0的值为0,EOF的值为-1,\0是字符串的结束标志,EOF是文件的结束标志,两者作用的对象也不相同,一个作用于字符串,一个作用于文件。
在了解了这些对我们来说比较陌生的内容后,接下来我们来理解一下这几个代码;
//代码1
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)//getchar()——接收字符,相当于scanf("%c", &);
//EOF——end of file——文件结束标志,值为-1;
{
putchar(ch);//putchar()——输出字符,相当于printf("%c", );
}
return 0;
}
在这个代码里面我们看到了while语句,也就是意味着只要我们输入的值不等于文件结束标志,我们就能一直输入,是不是这样呢?我们来试一下,依次输入A/BC/EOF/Ctrl+Z(文件结束标志)来看看结果:
最后一个^Z是输入的CTRL Z,我们可以看到输入前面的内容,它都能继续执行,但是输入CTRL Z后程序终止运行了。
可能这里有朋友就会问了,为什么你上面输入EOF没有用,这里我的理解是EOF它仅仅只是三个字符,这些字符被getchar一个一个识别后再一个一个打印出来,并没有任何附加功能,但是CTRL Z可以算是一个快捷键,这个快捷键的作用就是输入文件结束标志.
有细心的朋友会注意到我们前面的附图中,EOF显示的是#define EOF (-1)根据我们之前学到的知识可以知道,EOF其实是#define定义的标识符常量,下面是我通过联机搜索到的内容:
第一个代码我理解的意思就是可以连续输入除了文件结束标志以外的字符,输入完的字符,计算机会第一时间给输出出来。
下面我们来看第二个代码:
//代码2
int main()
{
char ch = '\0';
while ((ch = getchar()) != EOF)
{
if (ch < '0' || ch>'9')
{
continue;
}
putchar(ch);
}
return 0;
}
这个代码我们在理解前要回顾一下ASCII码值:
大家可以看一下我们的字符0和字符9所在的位置,然后我们再回过来看看if判断条件<'0' || >'9'这个区间范围是出来字符0~9的所有字符,然后他在这个范围内执行的语句是continue,跳过本次循环,回到while条件判断,这个意思是不是输入字符0~9外的其它字符都无法打印,只能打印0~9的字符,下面我们就来验证一下:
这里我们可以看到除了0~9的字符外,输入其它的字符都无法打印,所以我们可以下一个结论,这个代码是来打印数字字符的代码。
今天的内容到这里就结束了,可能会有朋友有疑惑,我们本章说的是while语句,为什么结尾提到这两个代码?它是有什么用吗?这两个代码的具体作用,后面会随着我学习的深入,第一时间与大家分享。最后希望今天的内容对大家理解while语句的知识点会有帮助,感谢各位的翻阅,咱们下一篇见。