2010-06-01 43 views
4

在C中有一个do while循环和pascal(几乎)等效是重复until循环,但是两者之间有一个小的差异,而两个结构将迭代至少一次,并检查他们是否只需要最后再次执行循环,在pascal中,您编写了需要满足的条件以终止循环(重复直到某事),并在C中写出需要满足的条件继续循环(DO WHILE)。是有原因存在这种差异还是只是一个任意的决定?帕斯卡的重复...直到与C的做...而

+6

下面是一些复制和粘贴到您的代码的备用:!!!!!!!!!!!! – 2010-06-01 23:14:19

+0

Hellfreezeover:= false;重复直到Hellfreezeover – 2011-06-30 21:16:50

回答

0

我一直发现UNTIL循环倒退,但那可能只是因为我来自C背景。有像Perl这样的现代语言可以提供这两种语言,但是对于其他语言来说没有任何特别的优势

+0

我个人也认为C版本更有意义,我来自一个pascal背景,所以一旦我开始学习C,我发现自己在C中编写了错误的条件。 – Bob 2010-06-01 23:16:22

3

我不确定历史影响,但在我看来C更一致,因为if s要求条件为true代码运行,如while s和do while s。

+0

和'for' , 对于这个问题。 – caf 2010-06-01 23:46:43

8

根本没有什么根本性的差异,对其中一个没有任何好处。它只是“语法糖” - 语言语法的改变不会以任何真实的方式改变其行为。有些人认为“重复直到”更容易概念化,而其他人则觉得“重复”更容易。

如果在C,你遇到的情况下“直到”是什么愿望,你可以永远只是否定条件:

do { 
    excitingThings(); 
} while (!endOfTheWorld()); 
+12

+1检查世界是否没有结束。 – Bob 2010-06-01 23:18:39

+0

至少,我们都做了一件令人兴奋的事情:D – Nyan 2010-06-04 05:05:52

1

这只是一个武断的决定。有些语言同时具备。 QBASIC/VB DO...LOOP语句支持前测/后测和WHILE/UNTIL的所有四种组合。

1

没有任何“决定”以任何方式将Pascal repeat /直到循环的行为与C do/while循环的行为联系起来,既不是故意也不是任意的。这只是两个完全不相关的问题。

4

在C语句

while(some_condition); 

可能要么是一个“什么都不做”循环或可能已经成为从“做... while”循环分离。

do { 
    statement; 
    statement; 
    statement; 
    lots more statements; 
} 

while(some_condition); 

使用不同的关键字 - 直到 - 避免这种可能的误解。

这些日子里没有这样的问题,当大家打开所有的编译器警告并注意他们时,不是吗? 不过,我怀疑大多数资深C程序员都希望 - 在某些时候或其他 - C在这种情况下使用“直到”。

+1

我用'while(cond)continue;'来说明循环体是空的。 – 2010-06-02 00:09:40

+0

@Loadmaster - 好主意 - 我可能会为自己的代码采用那个。 – Dipstick 2010-06-02 06:47:24

+0

@ChrisHarris:是的,一个循环体的空语句(一个纯分号)是一个等待发生的错误。错误的代码风格。 – 2010-06-14 20:27:29

0

C语法不需要额外的关键字。

在C中,两个关键字dowhile适用于两种循环。 Pascal需要四个关键字:while,do,repeatuntil

+0

您只需要更多关键字。 'while'for precondition,'repeat'or'do' and'until' for postcondition – 2010-06-02 05:56:17

+1

另一方面,C回收关键字,可能导致混淆。请参阅ChrisHarris的帖子 – 2010-06-05 13:55:44

3

Pascal的设计部分受到20世纪60年代结构化编程工作的启发,包括Edsger Dijkstra的开创性工作A Discipline of Programming。 Dijkstra(认为goto有害的同一个人)发明了创建方案的方法,这些方案通过施工是正确的。这些方法包括编写循环的方法,这些方法专注于循环终止时建立的后置条件。在创建repeat... until表单时,Wirth受到了Dijkstra的启发,在代码中明确了终止条件,而不是其补充条件。

我一直钦佩如Smalltalk和图标的语言,它提供句法形式,从而使程序员能够清楚地表达自己的意图,而不必依赖于容易漏诊补运算符。 (在图标中,表格为while e1 do e2until e1 do e2;在Smalltalk中,它们是block1 whileTrue: block2block1 whileFalse: block2。)从我的观点来看,C和Pascal都不是完全构建出来的正交设计。

+0

因此,如果采用perl,它甚至会与'if'互补,这是'unless',您可以将它们放在声明之前或之后。但是perl的正交性并不是真正的优势。 – 2010-06-02 05:53:22

+0

+1,提供这两种语言的形式允许更多可读代码。 – Artelius 2010-06-03 02:58:48