《计算机系统:核心概念及软硬件实现(原书第4版)》——2.2控制流

简介:

本节书摘来自华章计算机《计算机系统:核心概念及软硬件实现(原书第4版)》一书中的第2章,第2.2节,作者:[美] J. 斯坦利·沃法德(J. Stanley Warford)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.2控制流

程序是按照一条语句接着一条语句的方式顺序执行的。有两种方式可以改变控制流,进而改变程序顺序:选择和循环。C++有if和switch语句用于选择,while、do和for语句用于循环。每一条语句都执行一个可能改变控制流顺序的测试。最常见的测试是用图2-9所示的6种关系运算符之一进行的。
2.2.1if/else语句
图2-10给出了一个C++ if语句的简单用法,用大于或等于关系运算符>=执行测试。程序输入整型变量num的值,然后把它和整型常量limit进行比较,如果num的值大于或等于limit的值(100),则输出单词high,否则输出low。没有else部分的if语句是合法的。
可以用图2-11所示的布尔运算符把数个关系测试结合起来。两个&号(&&)是AND运算符,两个竖线(||)是OR运算符,惊叹号(!)是NOT运算符。
image

例2.3如果年龄、收入和缴税是整型变量,if语句
image

表示,如果年龄小于21且收入少于$4000,则缴税值设置为0。 □
在图2-10中的if语句,每个选择只有一条语句。如果在一个选择中需要执行多于一条的语句,那就必须用花括号{}把这些语句括起来,否则括号是可选的。
例2.4图2-10中的if语句可以这样写
image

输出语句不用花括号括起来。 □
2.2.2switch语句
图2-12中的程序使用C++的switch语句和用户玩一个竞猜小游戏,要求用户挑一个数字,然后根据输入的数字输出相应的消息。

image


也可以用if语句获得和switch语句相同的结果,然而等价的if语句不如switch语句效率高。
例2.5图2-12中的switch语句可以用逻辑上等价的嵌套的if语句写为
image

然而,这个代码不如switch语句效率高。使用这个代码,如果用户猜3,那么所有4个测试都要执行。使用switch语句,如果用户猜3,程序直接跳到“Too high”语句,而不必用0、1和2与guess比较。
2.2.3while循环
图2-13中的程序是一个没有什么实际意义的程序,它唯一的目的是说明C++的while循环。程序的输入是以星号(*)结尾的一个字符串,输出不包括星号的所有字符。有经验的C++程序员不会用这个技巧。图2-13和本章中所有的程序都是为了在后面的章节中能够对它们在更低的抽象层次上进行分析。

image


在进入循环前,程序给全局变量letter输入第一个字符的值 。语句
image

将letter的值和星号字符进行比较。如果它们不相等,那么执行循环体,输出这个字符,然后输入下一个字符。接着,控制流返回到循环顶部的条件判断。
如果letter是局部变量而不是全局变量,那么程序的输出还是一样。把变量声明为全局的还是局部的是一个软件设计问题。经验法则是:总是把变量声明为局部变量,除非有很好的原因不这么做。局部变量能增强软件系统的模块性,让长程序更容易阅读和调试。图2-4和图2-13中的全局变量不代表好的软件设计。以这种方式呈现是为了说明C++的内存模型。后面的章节会展示C++编译器怎样翻译本章中给出的程序。
2.2.4do循环
图2-14中的程序说明do语句的使用。这个程序比较特殊,因为它没有输入,每次程序执行都生成同样的结果。这也是一个没有实际意义程序,只是为了说明控制流。

image


一个警官的初始位置在0单位处,然后开始追一个初始位置在40单位的司机。每执行循环体一次代表一个时间间隔,在此期间,警官行进25个单位,司机行进20个单位。语句
image

是C++中语句
image

的缩写形式。
与图2-13中的循环不一样,do语句是在循环的底部进行测试,因此循环体能保证至少被执行一次。当执行语句
image

执行时,它比较cop的值和driver的值。如果cop小于driver,则控制流转到do,于是循环体重复。
2.2.5数组和for循环

image


图2-15中的程序用来说明for循环和数组。程序分配了一个4个整数的局部数组,把值输入数组,然后以相反的顺序输出值。
语句
image

声明变量vector,该变量是一个由4个整数组成的数组。在C++中,所有数组的第一个索引都是0。因此,这个声明为数组元素
image

分配存储空间。
声明中的数字指定要分配多少个元素,它总是比最后一个元素的索引大1。在这个程序中,元素个数是4,比最后一个元素的索引3大1。
每个for语句有一对圆括号,它里面分为3个部分,各部分之间用分号隔开。第一个部分赋初值,第二个部分是测试,第三个部分是增量递增。在这个程序中,for语句
image

中,j=0是赋初值,j<4是测试,j++是递增。
当程序进入循环时,j设置为0,因为测试在循环的顶部,所以j的值和4进行比较。由于j小于4,所以循环体
image

执行。输入流中的第一个整数值被读入v[0]。控制返回到for语句,因为第三个部分的表达式是j++,所以j递增1。接着j的值和4比较,重复处理过程。
递减表达式
image

是C++中j=j-1的缩写,所以第二个循环是以相反的顺序打印值

相关文章
|
存储 C++ Python
《计算机系统:核心概念及软硬件实现(原书第4版)》——导读
这种方法为讨论计算机科学中的核心问题提供了一种很自然的环境。例如,本书介绍了HOL6层的结构化编程,可以和Asmb5层的非结构化编程的可能性进行对比。书中讨论了goto争议、结构化编程/效率之间的折中,给出了两个层次上语言的实际例子。
1833 0

热门文章

最新文章