上QQ阅读APP看书,第一时间看更新
3.3.5 控制流程错误
1.如果程序包含多条分支路径,比如有计算GO TO语句,索引变量的值是否会大于可能的分支数量?例如,在语句中,i的取值是否总是1、2或3?
2.是否所有的循环最终都终止了?应设计一个非正式的证据或论据来证明每一个循环都会终止。
3.程序、模块或子程序是否最终都终止了?
4.由于实际情况没有满足循环的入口条件,循环体是否有可能从未执行过?如果确实发生这种情况,这里是否是一处疏漏?例如,如果循环以下面的语句作为开头:
当NOTFOUND初始时就为假,或者x大于z时,情况会如何呢?
5.如果循环同时由迭代变量和一个布尔条件所控制(如一个搜索循环),如果循环越界(fall-through)了,后果会如何?例如,伪指令循环以开头,如果NOTFOUND永不为假,会发生什么结果呢?
6.是否存在“仅差一个”的错误,如迭代数量恰恰多一次或少一次?这在从0开始的循环中是常见的错误。我们会经常忘记将“0”作为一次计数。举例来说,如果想编写一段Java代码执行10次循环,下面的语句是错误的,因为它执行了11次:
正确的应该是执行10次循环:
7.如果编程语言中有语句组或代码块的概念(例如do-while或{……}),是否每一组语句都有一个明确的while语句,并且do语句也与其相应的语句组对应?或者,是否每一个左括号都对应有一个右括号?目前的大多数编译器都能识别出这些不匹配的情况。
8.是否存在不能穷尽的判断?举例来说,如果一个输入参数的预期值是1,2或3,当参数值不为1或2时,在逻辑上是否假设了参数必定为3?如果是这样的话,这种假设是否有效?