《代码阅读方法与实现》阅读笔记二

对本书的第二章和第三章的内容总结:

2.6break和continue语句
Break语句将程序转移到最内层的循环或switch语句之后执行。大多数情况下,break用于提前退出循环。Continue语句则跳过该语句到循环末尾之间的语句,继续最内层循环的迭代。Continue语句会再次计算while条件表达式的值,并执行循环。在for循环中,该语句将首先计算第三表达式的值,之后是条件表达式。Continue用在循环体分开处理不同情况的地方;每种情况一般都以continue结束,以便进行下一次循环迭代。
2.7字符和布尔型表达式
多数现代语言中,布尔表达式只对需要的部分进行求值。在用&&运算符(逻辑与)连接起来的表达式序列中,第一个表达式的求值结果如果为false,则会结束整个表达式的求值,并生成false结果。类似的,在用||运算符(逻辑或)连接起来的表达式序列中,如果第一个表达式求值为true,则会终止对整个表达式的求值,产生一个true结果。很多表达式都基于这种短路求值(short-circuit evaluation)特性,在阅读时也应该采用同样的方式。
大多数从C派生的语言,都有短路求值的特性,比如C+=,Perl和Java。
2.8 goto语句
Goto语句应尽量少用。
执行某些行动后(比如打印一条错误消息,或释放分配的资源),常常用goto语句退出程序或函数。有时用做公共的错误处理器。程序的正常退出路径位于错误处理器之前,从而保证当没有错误发生时,处理器不会被调用。
Goto语句还经常用来重新执行某一段代码,可能是在某些变量的值发生改变,或者执行完某些处理之后。虽然这样的构造经常可以用结构化循环语句结合break和continue来完成,但实践中,使用goto有时能够更好地传达编码者的意图。一个单独的标记――几乎总是命名为again或retry,用做goto的目的地。
在嵌套循环和switch语句中,goto语句可以用来替代break和continue――这两个语句只影响最内层循环的控制流程,改变程序的控制流程。在大型、复杂的循环中使用这种做法可以澄清控制流程的走向,同时避免了向嵌套循环中添加特定break或continue语句引发错误的可能性。
2.9小范围重构
在阅读自己所控制的代码时,要养成添加注释的习惯。
2.10 do循环和整型表达式
执行算术运算时,当b=2n-1时,可以将a&b理解为a%(b+1)。这样书写表达式是为了将除法替换为逐位与指令(有时计算起来更高效)。但现代处理器上,这种差别已经很小了,我们要学会阅读使用这些小技巧,但要避免使用它。
还有两种情况,会用位指令来替代算术指令。它们是移位(shift)运算<<和>>――将整数的位向左或向右移动,由于整数每个二进制位的值均为2的幂,移位一个整数就等同于用2的幂去乘或除该整数,幂的次数就是移位的数目。因此,我们可以从算术意义来思考移位运算符。
2.11再论控制结构
第一个要记住的:每次只分析一个控制结构,将它的内容看作是一个黑盒。
第二条规则:将每个控制结构的控制表达式看作是它所包含代码的断言。

你可能感兴趣的:(《代码阅读方法与实现》阅读笔记二)