跳转到内容

计算机编程/控制

来自维基教科书,开放世界中的开放书籍
这篇计算机编程文章适用于 伪代码Adaooc

条件语句

[编辑源代码]

条件子句是代码块,只有当特定表达式(条件)为 时才会执行。

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 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 Value

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
华夏公益教科书