C语言探索之旅 | 第一部分第九课:循环语句

作者 谢恩铭,公众号「程序员联盟」(微信号:coderhub)。
转载请注明出处。
原文:https://www.jianshu.com/p/9193259c0724

《C语言探索之旅》全系列

内容简介


  1. 前言
  2. 循环是什么
  3. while 循环
  4. do...while 循环
  5. for 循环
  6. 总结
  7. 第一部分第十课预告

1. 前言


上一课是 C语言探索之旅 | 第一部分第八课:条件表达式

下一课我们就要一起编写第一个 C语言的小程序啦,激动吗?那就快点把今天这课学完吧。

循环,是什么呢?

简单地说:循环使你能够重复执行同样的指令。

放轻松,这一课的内容相对比较简单,不像之前的【变量】和【条件表达式】那么难以消化,所以好好享受这一课吧。因为第二部分就要开始难起来咯!

2. 循环是什么


循环是一种结构,使指令可以被执行多次。

与 条件语句/条件表达式 类似,循环语句也有几种形式。但是至终,目的仍然是一样的:多次执行同样的指令。

我们一起来看看 C语言中常用的三种循环:

  • while 循环
  • do...while 循环
  • for 循环

这三种循环的基本原理都是一样的,如下图所示:

上图中,依次进行的是:

  1. 电脑从上到下执行各条指令,像往常一样。
  2. 执行完最后一条命令,重新回到第一条命令,从上往下开始执行。
  3. 如此周而复始。

上图中存在的问题是:如果我们不停止循环,那么电脑是有能力一直执行下去的(“我一路向北,离开有你的季节,方向盘周围,回转着我的后悔” -- 歌词来自周杰伦的歌曲《一路向北》)。

是的,我们的电脑兄不像有些人,它是从来不抱怨的,叫它干什么就干什么,这也是我们喜欢它的原因。

永不停止的循环有一个术语叫“死循环”,陷入死循环的电脑很容易卡机,这也是程序员经常抱怨的问题之一。

怎么能够让循环停下来呢?

聪明的读者已经想到了:条件表达式 。

对了,上一课我们学了条件表达式,现在到它派用场的时候了。

事实上,我们创建循环语句的时候,总会给它一个条件,这个条件指明:在条件为真时,才继续执行循环,否则停止。

下面我们就来看看第一种循环:while 循环。

3. while 循环


while 循环的结构是这样的:

while (/* 条件 */)
{
    // 重复执行的指令
}

不难理解吧,while 在英语中是“当...时”,即是说:

当括号里的“条件”为真时,执行大括号里的指令,一旦条件变为假,不执行指令,while 循环结束。

用一个小程序来看一下吧,这个程序中,我们要让用户输入数字 27,只有当用户输入的是 27 时,程序才会停止,否则会一直让用户输入数字(是的,我很任性):

#include <stdio.h>

int main(int agrc, char *argv[]) {
    int number = 0;

    while (number != 27) {
        printf("请输入 27 ! ");
        scanf("%d", &number);
    }

    return 0;
}

运行程序,会如下显示:

请输入 27 ! 10
请输入 27 ! 17
请输入 27 ! 30
请输入 27 ! 27

接下来,我们用 while 循环来做一点更有意思的事情:让循环执行一定次数 。

int counter = 0;

while (counter < 10) {
    printf("你好 !\n");
    counter++;
}

它会显示 10 次“你好!”,如下:

你好!
你好!
你好!
你好!
你好!
你好!
你好!
你好!
你好!
你好!

逻辑到底是怎么样的呢?

  1. counter 初始值为 0 。

  2. 我们的 while 循环的循环条件是 counter < 10,也就是说,只有在 counter 变量的值小于 10 的时候,才会执行循环体(大括号里)的指令:打印“你好!”。

  3. 因为初始 counter 是 0,循环条件为真,所以执行 printf,显示“你好!” 。

  4. 在循环体中,我们将 counter 的值加 1 。

  5. 第二次判断条件的时候,counter 的值已经是 1 了,但还是满足 counter < 10 这个条件,因此再次显示“你好!”。

  6. 如此这般,一直到 counter 的值变为 10,不满足 counter < 10 这个条件了,while 循环才结束,所以一共打印了十个“你好!”。

为了加深理解,我们再来写一个小程序,这次我们让 while 循环每次输出变量的值:

int counter = 0;

while (counter < 10) {
    printf("变量的值是 %d\n", counter);
    counter++;
}

执行程序,显示如下:

变量的值是 0
变量的值是 1
变量的值是 2
变量的值是 3
变量的值是 4
变量的值是 5
变量的值是 6
变量的值是 7
变量的值是 8
变量的值是 9

这下是否理解得更透彻了?

4. do...while 循环


do 表示“做”。

这种类型和 while 循环非常类似,不过比较少用到。

与 while 循环唯一的不同点就是循环条件的位置,while 循环中循环条件是在一开始,而 do...while 循环中是在最后:

int counter = 0;
do {
    printf("你好 !\n");
    counter++;
} while (counter < 10);

这样的不同改变了什么呢?

  • 很简单,while 循环可能会一次也不执行循环体(大括号里)的指令,假如条件一开始就不满足。

  • 而 do...while 循环是先执行循环体的指令,再做条件判断,所以 do...while 的指令至少会被执行一次。

如果我们将 do...while 循环中的变量 counter 初始化为 40,那么 do...while 会显示一次“你好!”,对于 while 循环,如果 counter 初始为 40,那么一次也不会显示“你好!”

5. for 循环


for 表示“对,对于”。

理论上,for 循环可以实现我们想要的任何类型循环。

之前已经说过,for 循环就是另一种形式的循环而已。

之前 while 循环的例子:

int counter = 0;
while (counter < 10) {
    printf("你好 !\n");
    counter++;
}

以上的代码,我们可以写一个 for 循环的版本,它们做的是同样的事情:

int counter;

for (counter = 0 ; counter < 10 ; counter++) {
    printf("你好 !\n");
}

这两个循环都会显示十次“你好!”。

for 循环和 while 循环有什么区别呢?

  • for 循环的例子中,counter 变量并没有在声明的时候初始化。

  • 在 for 后面的括号中,有更多的东西(下面我们会详述)。

  • 在循环体(大括号里的内容)中,没有 counter++ 这个指令。

我们最感兴趣的是 for 后面的括号中的内容,因为那也是 for 循环吸引人的地方。

可以看到括号中有三条指令,用分号(;)分隔:

  • 第一条指令用于初始化:在我们的情况,我们将 counter 的值初始化为 0。

  • 第二条指令用于规定条件:和 while 循环一样,这个条件用于判断循环是否继续执行。当这个条件为真时,for 循环才会继续。

  • 第三条指令用于做自增:这条指令是在循环体中的指令执行完后才执行的,用于更新变量的值;大多数情况下我们是做自增,当然我们也可以做自减(counter--)或者增加/减少任意值(counter -= 2) (关于自增和自减,请回顾运算符那一课)。

因此,for 循环的逻辑是这样的:

  1. 括号里的第一句指令用于初始化变量,只会执行一次,之后不再执行。

  2. 对括号里的第二句指令做判断,如果条件为真,则执行循环体(大括号里)的指令;如果为假,则不执行循环体,for 循环结束。

  3. 执行完循环体里的指令,接着执行括号里的第三句指令,用于更新变量的值。

  4. 再次对括号里的第二句指令做判断,如果条件为真,则执行循环体(大括号里)的指令;如果为假,则不执行循环体,for 循环结束。

  5. 如此周而复始。注意,括号里的第一句指令只会执行一次,之后就用不上了。

简单说来,for 循环浓缩了很多内容在 for 后面的括号里。

一定要熟练掌握 for 循环,因为会很常用。

6. 总结


  1. 循环能够使我们的程序重复执行一系列指令。

  2. 有好几种循环:while,do...while,for 。依场景不同,选择某个循环会更适合。

  3. for 循环可能是使用最频繁的循环语句了,在里面我们经常会做变量的增减。

7. 第一部分第十课预告


今天的课就到这里,一起加油吧!

下一课:C语言探索之旅 | 第一部分第十课:第一个C语言小游戏

下一课我们将编写第一个 C语言小游戏!


我是 谢恩铭,公众号「程序员联盟」(微信号:coderhub)运营者,慕课网精英讲师 Oscar 老师,终生学习者。
热爱生活,喜欢游泳,略懂烹饪。
人生格言:「向着标杆直跑」

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容