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

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

原文发布于微信公众号 - 轮子工厂(Programmer-ing)

原文发表时间:2018-10-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏绿巨人专栏

学习Scala: 初学者应该了解的知识

30940
来自专栏WD学习记录

Python数据结构与算法笔记(4)

当数据项存储在诸如列表的集合中时,我们说它们具有线性或顺序关系。每个数据项都存储在相对与其他数据项的位置。在Python列表中,这些相对位置是单个项的索引值。由...

13810
来自专栏编程

程序员C语言C加加新手小白入门基础最容易犯的17种错误,你中了几个?

相信这么努力的你 已经置顶了我 C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考...

25850
来自专栏微信公众号:Java团长

JAVA之旅(一)——基本常识,JAVA概念,开发工具,关键字/标识符,变量/常量,进制/进制转换,运算符,三元运算

比如6:6/2 = 3 余 0 3 / 2 = 1 余 1 那就是从个位数开始011,读起来就是110了

20110
来自专栏轮子工厂

卧槽,为什么你的程序执行到一半就退出了,原来是因为加了这个

快到月底了,相信有很多人都和呆博一样,不是“快揭不开锅了”,而是已经快要把锅都吃了〒▽〒。没关系我们可以一起吃掉这篇精神食粮啊,营养又健康,如果觉得味道还不错,...

33420
来自专栏逸鹏说道

Python3 与 C# 基础语法对比(String专栏)

Python3 与 C# 基础语法对比:https://www.cnblogs.com/dotnetcrazy/p/9102030.html

14130
来自专栏深度学习自然语言处理

【干货】python正则表达式应用笔记

正则表达式 (Regular Expression) 又称 RegEx, 是用来匹配字符的一种工具. 在一大串字符中寻找你需要的内容. 它常被用在很多方...

32880
来自专栏恰童鞋骚年

你必须知道的指针基础-3.指针的移动及指针的危险

  指针每次加一就是指针向前移动指针类型对应的字节数。下面通过一个int指针来指向一个int数组,看看指针的加法运算到底是个什么鬼?

10620
来自专栏落影的专栏

程序员进阶之算法练习(二十)

前言 这四个题属于中等,有的需要一定的代码量,有的需要奇妙的思考。 正文 1. Sonya and Queries 题目链接 ** 题目大意:** 给出一...

35140
来自专栏逸鹏说道

Python3 与 C# 基础语法对比(String专栏)

Python3 与 C# 基础语法对比:https://www.cnblogs.com/dotnetcrazy/p/9102030.html

14220

扫码关注云+社区

领取腾讯云代金券