wo这周有点懒啊,这才第 2 篇,个人有点事情,本来预计可以更新……1 篇的,︿( ̄︶ ̄)︿
厂长约我出去玩儿我都拒绝了,我的心里可只有你们哦~
循环结构是编程中常常使用的结构,当在程序中存在着需要循环执行多次的代码时,可以采用循环结构实现。今天将要介绍的是 C 语言中常见的是 while 循环和 for 循环。
1
while 循环结构
1.1
因此语法非常简单,使用方法如下
比如说厂长现在突然想统计从键盘输入的一行英文句子的字符个数,还画了下面这样的流程图
由流程图可知,代码会一直读取输入字符串中的字符并计数,直至读到最后标志字符串结束的 '\n',具体代码如下
在ubuntu16.04下通过gcc编译执行得到如下结果
其中 34 个字符包含了其中的空格。
1.3
需要注意的是,在do…while 语句中 while (表达式); 的后面有一个分号,但是在 while 语句中 while (表达式) 是没有分号的。do…while 与 while语句相反,先执行循环体的内容再判断表达式是否为真,如下图所示
这种循环结构比较特殊,常常用于用户登陆密码验证问题,当输入的密码不正确的时候会要求一直输入密码直至正确(当然生活中的密码往往只可以进行有限次的尝试),常常采用如下左图的使用方式
为如果采用 while 语句而不是采用 do … while 语句,就会产生上图中右图的现像,代码会有两部分十分相近。
1.4
对于上述的两种循环,其中的 while 语句是入口循环条件, do … while 语句是出口循环条件。入口循环条件是首先判断条件是否满足,然后在执行循环体内容;而出口循环条件是先执行循环体,然后判断条件是否满足,因此循环体的内容至少会执行一次。
对于 while 语句来讲,他的基本结构一般如下图所示
通常一个循环都将涉及到三个动作,初始化计数器、判断循环条件是否满足和更新计数器。但是这种方式导致我们书写一个 while 循环至少需要三个语句,为了简化可以使用 for 循环。
2
灵活的 for 语句
for 语句的用法如下所示
在 for 语句中三个表达式用分号隔开,其中表达式1是循环初始化表达式(对应上面的 “初始化计数器”),表达式2是循环条件表达式(对应上面的 “循环条件”),表达式3是循环调整表达式(对应上面的 “更新计数器”)。
这样一来,for 语句将初始化计数器、循环条件判断、更新计数器三个动作组织到了在一起,那么以后如果要修改循环的次数,每次递进的跨度,或者循环结束条件,只需要在 for 语句后边的小括号内统一修改即可。
2.1
for 语句的表达式1,表达式2和表达式3都可以按照需要进行省略,但分号不能省,其中可以是包括但不限以下的任何一种形式
其中需要注意的是最后一个表达式,他实际上代表的是一个死循环。在程序中有死循环的存在并不代表着程序一定出现了错误,因为有的情境下需要死循环,如一个服务不停地向用户发送一个请求之类的。
下面是一个 for 语句使用的示例说明,通过 for 循环将一句话打印十遍。
如下是省略表达式 1 的情况
在上面的代码中,因为初始化的过程已经在之前的部分完成,所以可以在 for 语句简化这部分;当让我们还可以省略 count ++ ,将其放在循环体中,但是这种代码与 while 循环的差别也就不大了。所以除非有较为特殊的需求,否则过多的省略 for 语句,一方面使得程序较为难懂,另外也有可能降低程序的效率。
判断一个数字是否为素数
素数指在大于 1 的自然数中,除了 1 和此数自身外,无法被其他自然数整除的数。关于素数的求法有很多,这里我们用比较朴素暴力的方式:迭代测试从2到num/2所有整数是否能被整除(num为待测试的整数),如果没有出现能被整除的整数,那么它就是素数。
具体代码如下所示
执行上面的程序可以根据输入判断其是否为一个素数,这种判断方式较为麻烦,只是对本节课 for 循环的一个联系,在后面会介绍更为简单的方法。
2.2
表达式1和表达式3可以是一个简单的表达式,也可以用逗号分隔多个表达式,如下所示
在表达式 1 中,同时对 i j 两个变量进行初始化,同样的,在表达式 3 中同时对两个变量的值进行调整。
2.3
在 C99 的新标准中允许在 for 语句的表达式 1 中定义变量,如下所示
使用 gcc 进行编译的时候需要加上 –std=c99,否则可能会出错。因此在编译的时候在终端中输入
其中的 test.c 为上述代码所对应的 C 文件。
增加这个新特性的原因主要是考虑到循环通常需要一个计数器,而这个计数器出了循环就没什么用了。所以在表达式1的位置定义的变量,活动范围仅限于循环中,出了循环,它就无效了。这个从原理上涉及到变量的生命周期,具体的将会在后面的函数的部分讲述。
2.4
循环结构跟分支结构一样,都可以实现嵌套。对于嵌套的循环结构,执行顺序是从内到外:先执行内层循环,再执行外层循环。
比如在下面的双层循环中,我们打印出变量 i j 来看看是否先执行内层循环,再执行外层循环。
执行这个程序的结果可以看到
很明显是先执行内层循环,在执行外层循环。
3
课后作业
通过到目前为止在这里我们已经更新 8 节课的内容了,对 C 语言应该有一些了解了,所以我在这里有一个大胆的想法,没错,就是一份热气腾腾的课后作业,而且是没有呆呆莱恩那种哦~
具体题目就是使用 for 循环打打印输出如下的一个九九乘法表
这里面不仅仅涉及到今天所讲的循环部分的内容,还涉及到了打印输出的内容,忘记的同学可以点击下面的链接回顾之前的内容,今日份答案将会在次条中给大家推送。
4
参考
[1] “小甲鱼” 视频课程《带你学C带你飞》【第一季】P13 14