在 C 中有一个 do while 循环,pascal 的(几乎)等价物是重复直到循环,但两者之间有一个小的区别,而两个结构将至少迭代一次并检查它们是否只需要再次执行循环最后,在帕斯卡中,您在 C 中编写终止循环所需满足的条件(REPEAT UNTIL 某事),您编写继续循环所需满足的条件(DO WHILE 某事)。存在这种差异是有原因的,还是只是一个武断的决定?
9 回答
根本没有本质区别,也没有优势。它只是“语法糖”——对语言语法的更改不会以任何实际方式改变其行为。有些人发现“重复直到”更容易概念化,而另一些人则发现“重复”更容易。
如果在 C 语言中,你遇到了“直到”是你想要的情况,你总是可以否定这个条件:
do {
excitingThings();
} while ( !endOfTheWorld() );
在 C 中声明
while(some_condition);
可能是一个“什么都不做”循环,或者可能已经脱离了一个“do ... while”循环。
do {
statement;
statement;
statement;
lots more statements;
}
while(some_condition);
使用不同的关键字 - until - 可以避免这种可能的误解。
如今,当每个人都打开所有编译器警告并注意它们时,这不是一个问题,不是吗?不过,我怀疑大多数资深的 C 程序员都希望——在某个时候或其他时间——C 在这种情况下使用“直到”。
我不确定历史影响,但我认为 C 更一致,因为if
s 需要条件为真才能运行代码,while
s 和do while
s 也是如此。
Pascal 的设计部分受到 1960 年代结构化编程工作的推动,包括 Edsger Dijkstra 的开创性工作A Discipline of Programming。Dijkstra(认为有害的同一个人goto
)发明了创建通过构造正确的程序的方法。这些方法包括编写循环的方法,这些循环关注循环终止时建立的后置条件。在创建repeat... until
表单时,Wirth 受到 Dijkstra 的启发,在代码中明确了终止条件,而不是其补码。
我一直很欣赏像 Smalltalk 和 Icon 这样的语言,它们提供了两种句法形式,从而使程序员可以清楚地表达他或她的意图,而不必依赖于容易遗漏的补码运算符。(在 Icon 中,形式是while e1 do e2
和until e1 do e2
;在 Smalltalk 中,它们是block1 whileTrue: block2
和block1 whileFalse: block2
。)从我的角度来看,C 和 Pascal 都不是完全构建的正交设计。
没有“决定”以任何方式将 Pascal 重复/直到循环的行为与 C 的 do/while 循环的行为联系起来,既不是故意的也不是任意的。这只是两个完全不相关的问题。
这只是一个武断的决定。有些语言两者兼而有之。QBASIC/VB DO...LOOP语句支持 pretest/posttest 和 WHILE/UNTIL 的所有四种组合。
只是一些信息。
跑路者:while(not edge) { run(); }
威利 E 郊狼:do { run(); } while(not edge);
我总是发现 UNTIL 向后循环,但这可能只是因为我来自 C 背景。有像 Perl 这样的现代语言可以同时提供这两种语言,但其中一种语言并没有任何特别的优势
C 语法不需要额外的关键字。
在 C 中,这两个关键字do
和while
适用于两种循环。Pascal 需要四个关键字:while
、do
、repeat
和until
。