跳转到内容

ooc 编程/控制

来自维基教科书,开放世界中的开放书籍
这篇文章是关于计算机编程中的控制语句,内容涵盖伪代码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 {
    another statement
}

优化提示

[编辑源代码]

当此程序执行时,计算机将按顺序检查所有条件,直到其中一个与它的真值概念相匹配。一旦发生这种情况,程序将执行紧随其后条件的语句,并继续执行,而不会检查任何其他条件。因此,当你试图优化程序时,最好按概率降序排列你的 if-else 条件。这将确保在最常见的场景中,计算机需要做的工作更少,因为它很有可能只需要检查一两个“分支”就能找到应该执行的语句。但是,在第一次编写程序时,不要过多地考虑这一点,以免你进行过早优化

话虽如此,你应该知道,优化编译器可能会随意重新排列你的if 语句,只要该语句没有副作用。除了其他技术之外,优化编译器甚至可能应用跳转表二分搜索


通常需要将一个特定变量与多个常量表达式进行比较。对于这种类型的条件表达式,可以使用match语句。例如

match (x) {
  case 1 =>
     walkTheDog()

  case 5 =>
     launchNuke()
 
  case =>
     selfDestruct()
 }

这里的最后一个case有一个空的条件。它被称为catch-all case,如果上面的任何情况都不匹配,则执行该代码。

与 C 或 Java 中的switch不同,不需要使用break关键字显式退出一个 case。每个匹配中只执行一个 case。这在牺牲一些灵活性的同时,确保了设计简单。例如,Duff's device 就不能用 ooc 编写。

然而,在某些方面,match比 switch 更灵活。例如,你可以有一个没有初始条件的匹配

match {
  case (x < 0) =>
     -1

  case (x > 0) =>
     1
 
  case =>
     0
}

在这里,我们在 cases 中定义了自定义条件,而不是要比较的值。圆括号是可选的,但这里为了可读性而包含了它们。它的行为与我们在第一行写了match (true) {完全一样。

与传统的switch语句的另一个区别是,match可以用作表达式。在这种情况下,它被评估为执行的 case 中最后一个语句的值。当你将 match 用作表达式时,最好有一个catch-all case,这样就不会出现值不确定的情况。

最后,值是使用等号运算符==进行比较的,它与任何 ooc 运算符一样,可以被重载。这意味着match也适用于字符串,因为字符串在核心 sdk 中重载了==

match (humor) {
  case "sad" =>
     ohNoes()

  case "happy" =>
     yay()
 
  case =>
     bahHumbug()
}

通过重载==运算符,可以在match语句中使用任何用户定义的类型。

无条件语句

[编辑 | 编辑源代码]

return 退出当前函数,可以选择将你给它的任何值传递到外部范围

 return 42

return 不一定总是有一个值,它也可以仅用于在任何时候退出函数

 return

ooc 没有goto关键字。可以使用breakcontinue控制循环的流程,并通过return退出函数。ooc 语言力求简单,并认为goto不属于高级语言。请参见Edsger Dijkstra的著作以了解更多信息[1]

循环允许你重复执行一组语句。

无限循环

[编辑源代码]

无限循环是指永不结束的循环,其中的语句会无限重复。术语“无限循环”是一个相对术语;如果正在运行的程序被某些超出程序控制范围的手段强行终止,那么无限循环确实会结束。


while (true) {
  doSomething()
}

开头带条件的循环

[编辑源代码]

此循环在开头有一个条件。只要条件满足,这些语句就会重复。如果条件在一开始就不满足,那么循环内部的语句永远不会执行。


while (x < 5) {
  x = calculateSomething()
}

中间带条件的循环

[编辑源代码]

有时你需要先进行计算,并在满足特定条件时退出循环。然而,当条件不满足时,还需要做其他事情。因此你需要一个循环,它的退出条件在中间。


while (true) {
  x = calculateSomething()

  if (x > 5) {
    break
  }

  doSomething(x)
}

跳过迭代

[编辑 | 编辑源代码]

continue 关键字可以用来跳过循环体的剩余部分,并直接进入下一个迭代。

while (true) {
  x = calculateSomething()

  if (x == 5) {
    // skip the 5th step
    continue
  }

  doSomething(x)
}

for 循环

[编辑源代码]

通常情况下,我们需要一个循环,其中一个特定的变量从给定的起始值向上或向下计数到特定的结束值。你可以在这里使用 while 循环——但由于这是一个非常常见的循环,因此有更简单的语法可用。


for (i in 1..11) {
   doSomething(i)
}

范围由 .. 分隔——你可以存储范围并在以后重复使用它们,例如:

range := 1..11
// then, later:
for (i in range) {
   doSomething(i)
}

这是可行的,因为 1..11 构造了一个新的 Range,它是一种 覆盖类型。覆盖类型将在后面的章节中解释。

for 允许迭代任何类型的值,只要它们实现了 iterator 方法,并返回一个 Iterator。例如,你可以迭代 ArrayLists

list := ["moody", "jolly", "bored"] as ArrayList<Int>
for (state in list) {
  println(state)
}

维基教科书

[编辑 | 编辑源代码]

参考文献

[编辑 | 编辑源代码]
  1. Edsger Dijkstra (1968 年 3 月). "Go To Statement Considered Harmful" (PDF). Communications of the ACM. 11 (3): 147–148. doi:10.1145/362929.362947. 无节制地使用 goto 语句会导致很难找到有意义的坐标来描述进程的进展。 ... goto 语句本身太过原始,它太过容易让人把程序弄得一团糟。
华夏公益教科书