2010-06-01 20 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