В C има do while цикъл и (почти) еквивалентът на pascal е repeat until цикълът, но има малка разлика между двете, докато и двете структури ще повторят поне веднъж и ще проверят дали трябва да направят цикъла отново само в края, в pascal пишете условието, което трябва да бъде изпълнено, за да прекратите цикъла (REPEAT UNTIL нещо) в C пишете условието, което трябва да бъде изпълнено, за да продължите цикъла (DO WHILE нещо). Има ли причина за тази разлика или е просто произволно решение?
Pascal's повторете, докато срещу C's do while
Отговори (9)
Няма никаква фундаментална разлика и никакво предимство за едното пред другото. Това е просто „синтактична захар“ — промяна в синтаксиса на езика, която не променя поведението му по никакъв реален начин. Някои хора намират „повтаряне до“ по-лесно за концептуализиране, докато други намират „повтаряне докато“ по-лесно.
Ако в C срещнете ситуация, в която „до“ е това, което е желанието, винаги можете просто да отхвърлите условието:
do {
excitingThings();
} while ( !endOfTheWorld() );
В C твърдението
while(some_condition);
може или да е цикъл "не правете нищо", или да се е отделил от цикъл "do ... while".
do {
statement;
statement;
statement;
lots more statements;
}
while(some_condition);
Използването на различна ключова дума - до - избягва това възможно погрешно тълкуване.
Не е такъв проблем в днешно време, когато всеки включва всички предупреждения на компилатора и им обръща внимание, нали? Все пак подозирам, че повечето ветерани C програмисти са пожелали - понякога или друг път - C да използва "до" в този случай.
while (cond) continue;
, за да стане ясно, че тялото на цикъла е празно.
- person David R Tribble; 02.06.2010
Не съм сигурен за историческите влияния, но по мое мнение C е по-последователен, в смисъл, че if
s изисква условие да е true, за да може кодът да се изпълнява, както и while
s и do while
s.
Дизайнът на 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 са напълно изграден, ортогонален дизайн.
if
, което е unless
и можете да ги поставите преди или след израза. Но ортогоналността на perl всъщност не е предимство.
- person Patrick Schlüter; 02.06.2010
Това е просто произволно решение. Някои езици имат и двете. QBASIC/VB DO...LOOP изразът поддържа всичките четири комбинации от pretest/posttest и WHILE/UNTIL.
Нямаше „решение“, което по някакъв начин да свърже поведението на Pascal repeat/until цикъл с поведението на C do/while цикъл, нито умишлено, нито произволно. Това са просто два напълно несвързани въпроса.
Само малко информация.
Road Runner : while(not edge) { run(); }
Wily E Coyote : do { run(); } while(not edge);
Винаги съм намирал UNTIL цикли назад, но това може да се дължи само на факта, че съм с опит в C. Има съвременни езици като Perl, които предоставят и двете, но няма особено предимство за единия пред другия
Синтаксисът на C не изисква допълнителни ключови думи.
В C двете ключови думи do
и while
работят за два вида цикли. Pascal изисква четири ключови думи: while
, do
, repeat
и until
.
while
за предварително условие, repeat
или do
и until
за постусловие
- person Patrick Schlüter; 02.06.2010