控制流语句
图灵完备型编程语言的一个重要特性是它的控制流能够分支,或者跳转到项目的另一部分。分支指令可以采用条件式(if - then
)、循环、switch语句或无条件语句,例如转到
,或子程序调用.
If语句
在许多高级语言中,如果
语句或条件用于根据执行期间评估的条件来指导控制流。
的基本形式如果
声明如下:
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 |
|
上面的另一种形式是开关
某些语言中的语句:
1 2 3 4 5 6 7 8 9 10 11 |
|
switch语句检查价值
匹配特定情况。注意,我们用a结束每个case打破
,没有它所有将执行后续代码。这叫做失败.
FizzBuzz问题从1循环到N,如果这个数字不能被3或5整除,打印“Fizz”,如果能被3整除,打印“Buzz”,如果能被5整除,打印“FizzBuzz”,如果能同时被两者整除,打印“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声明认为是有害的在1968年3月的ACM通讯中解释了为什么最好避免GOTO声明。一篇批评文章的题目是" GOTO声明被认为是有害的.另一份答复的标题是"GOTO被认为有害"被认为有害"被认为有害?
循环和条件
函数调用
看到的:子例程
在过程编程中,函数调用导致控制流从当前执行点跳转到子例程的开始。在现代编程语言中,函数调用是组织代码的一种非常有效的方法。
关于函数调用很重要的一点是它们会占用额外的内存空间。这是因为程序需要存储有关函数执行完成后执行流应返回到何处的信息。通常,这些信息存储在RAM中由操作系统分配的一个区域中,该区域称为堆栈.由于堆栈的大小通常是静态的,放置过多的函数调用可能是致命的。
在函数式编程语言中,函数在较低的层次是以类似的方式实现的,尽管从理论上讲这不是正确的方法。在函数式编程中,函数应该是声明性抽象,而不是过程性抽象。
在程序集中跳转指令
本节内容不完整。你可以通过编辑来提供帮助。
汇编中的跳转指令很像转到
在高级语言中。它们允许程序员在指令指针寄存器中设置值。
它们要么是无条件跳转(无条件转移指令
),或跳到平等,不平等,如果更大,更少,当溢出,等等。