计算机编程/控制
条件语句
[编辑源代码]条件子句是代码块,只有当特定表达式(条件)为 真 时才会执行。
if-else
[编辑源代码]if-else 语句是最简单的条件语句。它们也被称为分支,因为当程序在执行期间到达 if 语句时,控制权将“分支”到两个或多个“方向”中的一个。if-else 语句通常采用以下形式
if (condition): statement else: other statement
如果满足原始条件,则执行第一个语句中的所有代码。可选的 else 部分指定了一个备用语句,如果条件为假,则执行该语句。确切的语法在不同的编程语言中会有所不同,但大多数编程语言(尤其是 过程式 和 结构化 语言)都会内置某种形式的 if-else 条件语句。if-else 语句通常可以扩展到以下形式
if (condition): statement else if (condition): other statement else if (condition): other statement ... else (condition): another statement
整个块中只执行一个语句。这个语句将是第一个条件为真的语句。借助示例,可以更容易地理解 if-else-if 结构的概念
if (temperature is equal to or greater than 40 degrees celsius): print "It's extremely hot" else if (temperature is between 30 and 39 degrees): print "It's hot" else if (temperature is between 20 and 29 degrees): print "It's warm" else if (temperature is between 10 and 19 degrees): print "It's cool" else if (temperature is between 0 and 9 degrees): print "It's cold" else: print "It's freezing"
优化提示
[编辑源代码]当这个程序执行时,计算机将按顺序检查所有条件,直到其中一个条件与其对真的概念匹配。一旦发生这种情况,程序将执行紧跟在条件后面的语句并继续,而不会检查任何其他条件。出于这个原因,当您尝试 优化 程序时,最好按照降序 概率 排序您的 if-else 条件。这将确保在最常见的情况下,计算机需要做的工作更少,因为它很可能只需要检查一两个“分支”就能找到它应该执行的语句。但是,在第一次编写程序时,尽量不要考虑太多,以免发现自己进行了 过早优化。
话虽如此,您应该知道,当所讨论的语句没有 副作用 时,优化编译器 可能会随意重新排列您的 if 语句。除了其他技术之外,优化编译器甚至可能会应用 跳转表 和 二分查找。
case
[编辑源代码]通常有必要将一个特定变量与多个常量表达式进行比较。对于这种条件表达式,存在 case 语句。例如
case X : when 1 : Walk_The_Dog; when 5 : Launch_Nuke; when 8 or 10 : Sell_All_Stock; when others : Self_Destruct; esac;
无条件语句
[编辑源代码]无条件语句允许您在没有条件的情况下改变程序的流程。使用无条件语句时要小心。通常它们会使程序难以理解。阅读 goto 邪恶吗? 获取更多信息。
return
[编辑源代码]结束函数并返回到调用过程或函数。
对于过程
return
对于函数
return Value
goto
[编辑源代码]Goto 将控制权转移到标签后面的语句。
goto Label Dont_Do_Something; Label :
goto 邪恶吗?
[编辑源代码]自从 Dikstra 教授发表了他的文章 关于 Go To 语句的思考 以来,goto 在结构化编程语言中被认为是不好的做法,事实上,许多编程风格指南禁止使用 goto 语句。但经常被忽略的是,任何不是过程或函数中最后一个语句的返回也是无条件语句——一种伪装的 goto。不过有一个重要的区别:返回是 goto 的一种仅向前使用。异常也是一种 goto 语句;注意它们不需要指定要去哪里。
因此,如果您有包含多个 return 语句的函数和过程,您就会破坏程序的结构,类似于使用 goto。在实践中,几乎每个程序员都熟悉 'return' 语句及其相关行为;因此,在可读性方面,以下两个示例几乎相同
还要注意,Ada 中的 goto 语句比其他语言中的更安全,因为它不允许您将控制权
- 转移到主体之外;
- 在 case 语句、if 语句或 select 语句的不同备选方案之间;
- 在不同的异常处理程序之间;或者从已处理_语句序列的异常处理程序返回到其语句序列。
procedure Use_Return Do_Something if Test : return Do_Something_Else return end
procedure Use_Goto Do_Something if Test : goto Exit Do_Something_Else Exit : return end
由于使用 goto 需要声明标签,因此 goto 的可读性实际上是 return 的两倍。因此,如果可读性是您的关注点,而不是严格的“不要使用 goto”编程规则,那么您应该使用 goto 而不是多个 return。当然,最好的方法是结构化方法,不需要 goto 也不需要多个 return
procedure Use_If Do_Something; if not Test : Do_Something_Else; fi; return end
循环
[编辑源代码]循环允许您重复执行一组语句。
无限循环
[编辑源代码]无限循环是一个永远不会结束的循环,循环内的语句会永远重复。术语“无限循环”是一个相对术语;如果正在运行的程序被一些超出程序控制范围的方式强行终止,那么无限循环确实会结束。
loop : Do_Something; repeat
开头带条件的循环
[编辑源代码]此循环在开头有一个条件。只要满足条件,这些语句就会重复执行。如果一开始条件不满足,那么循环内的语句永远不会执行。
while (X < 5) : let X := Calculate_Something repeat
结尾带条件的循环
[编辑源代码]这种循环的条件在末尾,语句会重复执行,直到条件满足。由于检查是在末尾进行的,因此语句至少会执行一次。
loop X := Calculate_Something until (X > 5)
带中间条件的循环
[编辑源代码]有时需要先进行计算,并在满足特定条件时退出循环。但是,如果条件不满足,则需要做其他事情。因此,你需要一个在中间设置退出条件的循环。
loop X := Calculate_Something if X > 5 : exit Do_Something (X) repeat
for 循环
[编辑源代码]通常情况下,需要一个循环,将特定变量从给定的起始值向上或向下计数到特定结束值。你可以在这里使用 while 循环 - 但由于这是一个非常常见的循环,因此可以使用更简单的语法。
for I := 1 to 10 : Do_Something (I) repeat
数组上的 for 循环
[编辑源代码]另一种非常常见的情况是,需要一个循环,它遍历数组中的每个元素。以下示例代码展示了如何实现这一点。
for-each I in X : X [I] := Get_Next_Element; repeat