Pascal's повторете, докато срещу C's do while

В C има do while цикъл и (почти) еквивалентът на pascal е repeat until цикълът, но има малка разлика между двете, докато и двете структури ще повторят поне веднъж и ще проверят дали трябва да направят цикъла отново само в края, в pascal пишете условието, което трябва да бъде изпълнено, за да прекратите цикъла (REPEAT UNTIL нещо) в C пишете условието, което трябва да бъде изпълнено, за да продължите цикъла (DO WHILE нещо). Има ли причина за тази разлика или е просто произволно решение?


person Bob    schedule 01.06.2010    source източник
comment
Hellfreezeover := false;Повтаряйте до Hellfreezeover   -  person Mark Schultheiss    schedule 01.07.2011


Отговори (9)


Няма никаква фундаментална разлика и никакво предимство за едното пред другото. Това е просто „синтактична захар“ — промяна в синтаксиса на езика, която не променя поведението му по никакъв реален начин. Някои хора намират „повтаряне до“ по-лесно за концептуализиране, докато други намират „повтаряне докато“ по-лесно.

Ако в C срещнете ситуация, в която „до“ е това, което е желанието, винаги можете просто да отхвърлите условието:

do {
    excitingThings();
} while ( !endOfTheWorld() );
person VoteyDisciple    schedule 01.06.2010
comment
Поне всички правим едно вълнуващо нещо :D - person Nyan; 04.06.2010

В C твърдението

 while(some_condition);

може или да е цикъл "не правете нищо", или да се е отделил от цикъл "do ... while".

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

 while(some_condition);

Използването на различна ключова дума - до - избягва това възможно погрешно тълкуване.

Не е такъв проблем в днешно време, когато всеки включва всички предупреждения на компилатора и им обръща внимание, нали? Все пак подозирам, че повечето ветерани C програмисти са пожелали - понякога или друг път - C да използва "до" в този случай.

person Dipstick    schedule 01.06.2010
comment
Използвам while (cond) continue;, за да стане ясно, че тялото на цикъла е празно. - person David R Tribble; 02.06.2010
comment
@Loadmaster - добра идея - може да приема това за моя собствен код. - person Dipstick; 02.06.2010
comment
@ChrisHarris: Да, празен оператор (гола точка и запетая) за тяло на цикъл е грешка, която просто чака да се случи. Лош стил на код. - person David R Tribble; 15.06.2010

Не съм сигурен за историческите влияния, но по мое мнение C е по-последователен, в смисъл, че ifs изисква условие да е true, за да може кодът да се изпълнява, както и whiles и do whiles.

person Artelius    schedule 01.06.2010

Дизайнът на Pascal е мотивиран отчасти от работата по структурирано програмиране от 60-те години на миналия век, включително новаторската работа на Edsger 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 са напълно изграден, ортогонален дизайн.

person Norman Ramsey    schedule 02.06.2010
comment
Така че вземете perl, той има дори допълнението на if, което е unless и можете да ги поставите преди или след израза. Но ортогоналността на perl всъщност не е предимство. - person Patrick Schlüter; 02.06.2010
comment
+1, предоставянето на двете форми на езика позволява по-четлив код. - person Artelius; 03.06.2010

Това е просто произволно решение. Някои езици имат и двете. QBASIC/VB DO...LOOP изразът поддържа всичките четири комбинации от pretest/posttest и WHILE/UNTIL.

person dan04    schedule 01.06.2010

Нямаше „решение“, което по някакъв начин да свърже поведението на Pascal repeat/until цикъл с поведението на C do/while цикъл, нито умишлено, нито произволно. Това са просто два напълно несвързани въпроса.

person AnT    schedule 01.06.2010

Само малко информация.

Road Runner : while(not edge) { run(); }

Wily E Coyote : do { run(); } while(not edge);

person Richard A Quadling    schedule 15.08.2019

Винаги съм намирал UNTIL цикли назад, но това може да се дължи само на факта, че съм с опит в C. Има съвременни езици като Perl, които предоставят и двете, но няма особено предимство за единия пред другия

person Michael Mrozek    schedule 01.06.2010
comment
Аз лично също смятам, че C версията има повече смисъл и аз идвам от паскал произход, така че открих, че пиша грешното условие на C, след като започнах да изучавам C. - person Bob; 02.06.2010

Синтаксисът на C не изисква допълнителни ключови думи.

В C двете ключови думи do и while работят за два вида цикли. Pascal изисква четири ключови думи: while, do, repeat и until.

person David R Tribble    schedule 02.06.2010
comment
Ще ви трябва само още 1 ключова дума. while за предварително условие, repeat или do и until за постусловие - person Patrick Schlüter; 02.06.2010
comment
От друга страна, C рециклира ключови думи, което потенциално води до объркване. Вижте публикацията на ChrisHarris - person Marco van de Voort; 05.06.2010