控制流语句
编程语言要成为图灵完全的一个重要属性是它的控制流能够分支或者跳到节目的另一部分。分支指令可以是条件(if - then
),一个循环,一个开关语句,或无条件语句,如转到
,或子程序调用.
If语句
在许多高级语言中,如果
语句或条件用于根据执行期间求值的条件来指导控件的流。
an的基本形式如果
声明如下:
1 2 3 |
|
这里,条件应该是可以被解释为布尔价值,即可以被解释为真或假的东西。的do_something
语句是,所谓的if块.
的通常的扩展如果
是其他的
,它标记当且仅当(没有双关语意图)如果
块不执行,即条件不满足。
1 2 3 4 |
|
我们可以检查一系列不同的条件,使用如果
,在这种情况下,我们通常嵌套如果
语句。
1 2 3 4 5 6 7 8 |
|
对于像Python这样的缩进语言来说,这看起来确实很傻,但对于其他语言来说也是可以的。例如,在c++中:
1 2 3 4 5 6 7 8 9 |
|
幸运的是,我们有elif
语句,这是同一件事的简写。
1 2 3 4 5 6 |
|
上面的另一种形式是the开关
某些语言的声明:
1 2 3 4 5 6 7 8 9 10 11 |
|
switch语句检查是否价值
匹配特定的情况。注意,我们用a来结束每一种情况打破
,没有它所有的后续代码。这叫做失败.
FizzBuzz问题循环从1到N的数字,如果数字不能被3或5整除,则打印数字,如果数字能被3整除,则打印“Fizz”,如果数字能被5整除,则打印“Buzz”,如果数字能被5整除,则打印“FizzBuzz”。
1 2 3 4 5 6 7 8 9为我在范围(1,N+1):如果我%3.==0而且我%5==0:打印“FizzBuzz”elif我%3.==0:打印“饮料”elif我%5==0:打印“嗡嗡声”其他的:打印我
Goto语句
转到
语句是将执行流跳转到程序中其他地方的标记语句的指令。
1 2 3 4转到结束;性病::cout<<"这一行从未执行过"<<性病::endl;结束:性病::cout<<"太好了,现在我们就到最后了"<<性病::endl;
在上面的例子中,程序从来没有运行过第2行。
一个很好的使用方法转到
就是跳出一个嵌套很深的循环。
12 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
公平地说,转到
可用于替换包括循环在内的许多其他语句。例如,
1 2 3 4 5 6//打印1到10int我=1;前:性病::cout<<我;我++;如果(我< =10)转到前;
然而,这并不是一个好主意,因为它会导致所谓的意大利面条代码:控制流很难推理通过的程序。多亏了结构化编程,我们不再需要求助于这种实践了。
有趣的事实:计算机科学家Dijkstra发表了一篇文章GOTO声明被认为有害在ACM 1968年3月的通信中解释了为什么最好避免GOTO声明。发表了一篇批评文章,题目是“GOTO声明被认为有害”被认为有害.另一份答复的标题是“GOTO被认为是有害的”被认为是有害的?
循环和条件
函数调用
看到的:子例程
在过程式编程中,函数调用会导致控制流从当前执行点跳到子例程的开头。现代编程语言中的函数调用是组织代码的一种非常有效的方法。
关于函数调用的重要一点是,它们占用额外的内存空间。这是因为程序需要存储关于函数执行完成后执行流应该返回到哪里的信息。通常,此信息存储在由操作系统分配的称为堆栈.由于堆栈的大小通常是静态的,因此调用过多的函数可能是致命的。
在函数式编程语言中,函数在较低的级别中以类似的方式实现,尽管从理论上讲,这不是对它们进行推理的正确方法。在函数式编程中,函数应该是声明性抽象,而不是过程性抽象。
汇编中的跳转指令
本节不完整。您可以通过编辑来提供帮助。
汇编中的跳转指令很像转到
用高级语言。它们允许程序员在指令指针寄存器中设置值。
它们要么是无条件跳转(无条件转移指令
),或跳到平等,不平等,如果更大,更少,当溢出等。