哈维尔对我之前的回答(引用华兹华斯的那个)做了一个有趣的评论:
我认为 while(true){} 是一个比 while(condition){} 更“纯粹”的结构。
我无法在 300 个字符中做出充分回应(对不起!)
在我的教学和指导中,我非正式地将“复杂性”定义为“我需要在脑海中掌握多少其余代码才能理解这一行或表达式?” 我要记住的东西越多,代码就越复杂。代码明确告诉我的越多,复杂性就越低。
因此,以降低复杂性为目标,让我以完整性和强度而不是纯粹性来回答哈维尔。
我想到了这个代码片段:
while (c1) {
// p1
a1;
// p2
...
// pz
az;
}
同时表达两件事:
- 只要
c1
保持真实,(整个)主体就会重复,并且
- 在第 1 点,
a1
执行,c1
保证保持。
区别在于视角之一;a1
其中第一个通常与整个循环的外部动态行为有关,而第二个对于理解内部的静态保证很有用,我在特别考虑时可以依靠它。当然,a1
可能无效的净效应c1
,要求我更加努力地思考我在第 2 点可以指望什么,等等。
让我们放置一个特定的(小)示例来考虑条件和第一个操作:
while (index < length(someString)) {
// p1
char c = someString.charAt(index++);
// p2
...
}
“外部”问题是循环显然在内部做一些someString
事情,只要index
定位在someString
. 这建立了一个期望,即我们将在体内index
或someString
体内进行修改(在我检查身体之前不知道的位置和方式),以便最终发生终止。这给了我思考身体的背景和期望。
“内部”问题是我们保证第 1 点之后的操作是合法的,因此在阅读第 2 点的代码时,我可以考虑使用我知道已合法获得的 char 值做了什么。(如果是空引用,我们甚至无法评估条件someString
,但我也假设我们已经在这个示例的上下文中防范了这种情况!)
相反,以下形式的循环:
while (true) {
// p1
a1;
// p2
...
}
在这两个问题上让我失望。在外层,我想知道这是否意味着我真的应该期望这个循环永远循环(例如操作系统的主事件调度循环),或者是否还有其他事情发生。这既没有给我一个明确的阅读正文的上下文,也没有对构成(不确定的)终止进展的期望。
在内部层面上,我绝对不能明确保证在第 1 点可能存在的任何情况true
。当然,在任何地方都为真的条件是关于我们在程序中的任何点所能知道的最弱的陈述。在尝试思考动作完成什么时,了解动作的先决条件是非常有价值的信息!
所以,我认为这个成语比我上面描述的逻辑while (true) ...
更不完整、更弱,因此也更复杂。while (c1) ...