跳转至内容

编程基础/循环

来自维基教科书,开放世界中的开放书籍

“while”循环是一种控制流语句,它允许根据给定的布尔条件重复执行代码。可以将“while”循环视为重复的“if”语句。[1]

“先测试”循环简介

[编辑 | 编辑源代码]

在迭代(或重复)控制结构类别中,有两个常用的“先测试”循环。它们是“while”和“for”;本模块介绍“while”循环。

理解一般迭代 - “While”

[编辑 | 编辑源代码]

迭代的概念与可能想要重复操作相关联。就像所有控制结构一样,我们都会问一个问题来控制循环的执行。术语“循环”来自使用流程图时发生的循环运动。while 循环的基本形式如下所示

initialization of the flag 
while the answer to the question is true then do
    some statements or action
    some statements or action
    some statements or action
    update the flag

在大多数编程语言中,问题(称为测试表达式)是一个布尔表达式。布尔数据类型有两个值 - true 和 false。让我们重写结构来考虑这一点

initialization of the flag 
while the expression is true then do
    some statements or action
    some statements or action
    some statements or action
    update the flag

在“while”控制结构内,一个正常工作的循环有四个属性。它们是

  • 初始化标志
  • 测试表达式
  • 操作或操作
  • 标志的更新

标志的初始化技术上不是控制结构的一部分,但是在循环开始之前必须执行的操作。英文表达是,“当表达式为真时,执行以下操作。”这是循环在真值上。当测试表达式为假时,您停止循环并继续执行程序中的下一项。请注意,因为这是一个“先测试”循环,所以操作可能不会发生。它被称为“先测试”循环,因为测试在操作之前进行。它有时也称为“预测试”循环,这意味着测试在操作和更新之前(或拉丁语中为“before”)。

“While”循环的人类示例

[编辑 | 编辑源代码]

考虑一下父母和孩子之间的一段单方面对话。

刚吃完早餐,父母知道孩子吃了麦圈。过去的经验告诉他们,孩子通常会把麦圈洒在地板上。

父母告诉孩子:“只要地板上有一颗麦圈,就捡起来扔进垃圾桶。”

所有要素都存在,以确定孩子将要执行的操作(或流程)(在这种情况下是重复)。因为问题(地板上有一颗麦圈吗?)只有两个可能的答案(真或假),所以只要地板上有麦圈,孩子就会继续执行操作。因此,孩子要么 1) 从未捡起麦圈,因为他们从未洒过任何麦圈,要么 2) 捡起麦圈,并一次捡起一颗麦圈,直到所有的麦圈都被捡起来。

无限循环

[编辑 | 编辑源代码]

在这一点上,值得一提的是,良好的编程总是提供一种方法来确保循环问题最终会变为假,以便循环停止执行,程序继续执行下一行代码。但是,如果这种情况没有发生,那么程序将进入无限循环,并且不会停止,直到程序被外部终止或计算机重新启动。考虑以下代码

伪代码无限循环

loop_response = 'y'
While loop_response == 'y'
    Output "What is your age?"
    Input user_age
    Output "What is your friend's age?"
    Input friend_age
    Output "Together your ages add up to: "
    Output user_age + friend_age

程序员在循环之前为标志分配了一个值,这是正确的。但是,他们忘记更新标志。每次询问测试表达式时,它将始终为真。因此,它是一个无限循环,因为程序员没有提供退出循环的方法(他忘记更新标志)。考虑以下代码

loop_response = 'y';
While loop_response = 'y'
    Output "What is your age?"
    Input user_age
    Output "What is your friend's age?"
    Input friend_age
    Output "Together your ages add up to: "
    Output user_age + friend_age
    Output "Do you want to try again? y or n"
    Input loop_response

无论用户在标志更新期间回复什么,测试表达式都不会进行关系比较,而是进行赋值。它将“y”分配给变量,并询问“y”是否为真?由于所有非零值都被视为表示真值,因此测试表达式的答案为真。瞧,您有一个无限循环。

计数循环

[编辑 | 编辑源代码]

上面的例子是针对事件控制循环。标志更新是一个事件,有人决定是否要再次执行循环。通常,初始化会设置标志,以便循环至少执行一次。

while 循环的另一个常见用法是作为计数循环。考虑

counter = 0
While counter < 5
    Output "I love ice cream!"
    counter += 1

变量 counter 被认为是控制循环的。它在进入 while 循环结构之前被设置为零(称为初始化),只要它小于 5(五);将执行循环操作。但是,循环操作的一部分使用递增运算符将 counter 的值增加 1。在执行循环五次(counter 的值为 0、1、2、3 和 4 时执行一次)之后,表达式将为假,程序中的下一行代码将执行。计数循环旨在执行操作(可能是多条语句)一定次数。在我们的例子中,消息在监视器上显示五次。这是通过确保 while 控制结构的所有四个属性都存在并正常工作来实现的。这些属性是

  • 初始化标志
  • 测试表达式
  • 操作或操作
  • 标志的更新

缺少属性可能会导致无限循环或产生不良结果(无法正常工作)。

无限循环

[编辑 | 编辑源代码]

考虑

counter = 0;
while counter < 5
    Output "I love ice cream!"

缺少标志更新通常会导致无限循环。

计数的变体

[编辑 | 编辑源代码]

在下面的例子中,整数变量 age 被认为是控制循环的(也就是标志)。我们可以假设 age 在程序中早些时候有一个值。因为 while 结构是一个先测试循环;有可能该人的年龄为 0(零),并且第一次测试表达式时它将为假,并且循环的操作部分将永远不会被执行。

While 0 < age
    Output "I love candy!"
    age -= 1

考虑以下变体,假设 age 和 counter 都是整数数据类型,并且 age 有一个值

counter = 0;
While counter < age
    Output "I love corn chips!"
    counter += 1

这个循环类似于我们第一个计数循环示例,是一个计数循环。唯一的区别是,在我们的表达式中,我们没有使用文字常量(换句话说,是 5),而是使用了变量 age(以及存储在 age 中的值)来确定执行循环的次数。但是,与我们第一个计数循环示例不同的是,第一个计数循环示例将始终准确执行 5 次;有可能该人的年龄为 0(零),并且第一次测试表达式时它将为假,并且循环的操作部分将永远不会被执行。

关键术语

[编辑 | 编辑源代码]
计数控制
使用变量递增或递减来控制循环。
无限循环
由于循环没有终止条件、无法满足终止条件,或者导致循环重新开始,而无休止地循环的一系列指令。
初始化项
迭代控制结构的一个属性。
循环属性
与迭代或循环控制结构相关的项目。
可能不会发生
表示循环前测试可能不会执行操作。
while
循环前迭代控制结构。

参考文献

[编辑 | 编辑源代码]
华夏公益教科书