首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >8. 一花一世界,while for 循环?

8. 一花一世界,while for 循环?

作者头像
谭庆波
发布2018-11-08 18:34:30
7580
发布2018-11-08 18:34:30
举报
文章被收录于专栏:轮子工厂轮子工厂

wo这周有点懒啊,这才第 2 篇,个人有点事情,本来预计可以更新……1 篇的,︿( ̄︶ ̄)︿

厂长约我出去玩儿我都拒绝了,我的心里可只有你们哦~

循环结构是编程中常常使用的结构,当在程序中存在着需要循环执行多次的代码时,可以采用循环结构实现。今天将要介绍的是 C 语言中常见的是 while 循环和 for 循环。

1

while 循环结构

1.1

while 语句

while 语句只要表达式的值为真,就会不断执行循环体里边的语句或程序块,如下图所示

因此语法非常简单,使用方法如下

1.2 举例说明

一个很经典的例子是计算1+2+3+……+100的结果,但是用 while 循环却不是一种最好的方式,最好的方式相信大家都知道的,就是通过等差数列求和,直接根据求和公式编写程序,所以在这里我们换一个例子。

比如说厂长现在突然想统计从键盘输入的一行英文句子的字符个数,还画了下面这样的流程图

由流程图可知,代码会一直读取输入字符串中的字符并计数,直至读到最后标志字符串结束的 '\n',具体代码如下

在ubuntu16.04下通过gcc编译执行得到如下结果

其中 34 个字符包含了其中的空格。

1.3

do…while 语句

do…while 语句的语法非常简单,使用方法如下

需要注意的是,在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

在表达式 1 中定义变量

在 C99 的新标准中允许在 for 语句的表达式 1 中定义变量,如下所示

使用 gcc 进行编译的时候需要加上 –std=c99,否则可能会出错。因此在编译的时候在终端中输入

其中的 test.c 为上述代码所对应的 C 文件。

增加这个新特性的原因主要是考虑到循环通常需要一个计数器,而这个计数器出了循环就没什么用了。所以在表达式1的位置定义的变量,活动范围仅限于循环中,出了循环,它就无效了。这个从原理上涉及到变量的生命周期,具体的将会在后面的函数的部分讲述。

2.4

循环嵌套

循环结构跟分支结构一样,都可以实现嵌套。对于嵌套的循环结构,执行顺序是从内到外:先执行内层循环,再执行外层循环。

比如在下面的双层循环中,我们打印出变量 i j 来看看是否先执行内层循环,再执行外层循环。

执行这个程序的结果可以看到

很明显是先执行内层循环,在执行外层循环。

3

课后作业

通过到目前为止在这里我们已经更新 8 节课的内容了,对 C 语言应该有一些了解了,所以我在这里有一个大胆的想法,没错,就是一份热气腾腾的课后作业,而且是没有呆呆莱恩那种哦~

具体题目就是使用 for 循环打打印输出如下的一个九九乘法表

这里面不仅仅涉及到今天所讲的循环部分的内容,还涉及到了打印输出的内容,忘记的同学可以点击下面的链接回顾之前的内容,今日份答案将会在次条中给大家推送。

4

参考

[1] “小甲鱼” 视频课程《带你学C带你飞》【第一季】P13 14

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-10-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 轮子工厂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • while 语句
  • while 语句只要表达式的值为真,就会不断执行循环体里边的语句或程序块,如下图所示
  • 1.2 举例说明
  • 一个很经典的例子是计算1+2+3+……+100的结果,但是用 while 循环却不是一种最好的方式,最好的方式相信大家都知道的,就是通过等差数列求和,直接根据求和公式编写程序,所以在这里我们换一个例子。
  • do…while 语句
  • do…while 语句的语法非常简单,使用方法如下
  • 小结
    • 表达式的省略
      • 逗号表达式
      • 在表达式 1 中定义变量
      • 循环嵌套
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档