В C есть цикл do while, а его (почти) эквивалент в паскале — это цикл repeat until, но между ними есть небольшая разница, в то время как обе структуры будут выполнять итерацию хотя бы один раз и проверять, нужно ли им снова выполнять цикл, только в конец, в паскале вы пишете условие, которое необходимо выполнить, чтобы завершить цикл (ПОВТОРЯТЬ ДО чего-то), в C вы пишете условие, которое необходимо выполнить, чтобы продолжить цикл (ДЕЛАТЬ, ПОКА что-то). Есть ли причина, по которой существует эта разница, или это просто произвольное решение?
Паскаль повторяет до тех пор, пока C не делает, пока
Ответы (9)
Принципиальной разницы нет вообще, и нет преимущества одного над другим. Это просто «синтаксический сахар» — изменение синтаксиса языка, которое никак не меняет его поведение. Некоторые люди считают, что «повторять до» легче осмыслить, в то время как другим проще «повторять, пока».
Если в C вы сталкиваетесь с ситуацией, когда «до» — это то, что нужно, вы всегда можете просто отменить условие:
do {
excitingThings();
} while ( !endOfTheWorld() );
В C утверждение
while(some_condition);
может быть либо циклом "ничего не делать", либо быть отделенным от цикла "делать... пока".
do {
statement;
statement;
statement;
lots more statements;
}
while(some_condition);
Использование другого ключевого слова — «до» — позволяет избежать этого возможного неправильного толкования.
Не такая уж проблема в наши дни, когда все включают все предупреждения компилятора и обращают на них внимание, не так ли? Тем не менее, я подозреваю, что большинство программистов-ветеранов C пожелали - в то или иное время - чтобы C использовал "until" в этом случае.
while (cond) continue;
, чтобы было понятно, что тело цикла пусто.
- person David R Tribble; 02.06.2010
Я не уверен насчет исторических влияний, но, по моему мнению, C более последователен в том смысле, что if
требует, чтобы условие было истинным для запуска кода, как и while
и do while
.
Дизайн Pascal был частично мотивирован работами по структурному программированию 1960-х годов, включая новаторскую работу Эдсгера Дейкстры Направление программирования. Дийкстра (тот самый человек, который считал goto
вредным) изобрел методы создания правильных по построению программ. Эти методы включают в себя методы написания циклов, которые фокусируются на постусловии, устанавливаемом при завершении цикла. При создании формы repeat... until
Вирт был вдохновлен Дейкстрой сделать условие завершения, а не его дополнение, явным в коде.
Я всегда восхищался такими языками, как 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 поддерживает все четыре комбинации предварительного/послетестового тестирования и WHILE/UNTIL.
Не было никакого «решения», которое каким-либо образом связывало бы поведение цикла repeat/until в Паскале с поведением цикла do/while в C, ни преднамеренного, ни произвольного. Это просто два совершенно не связанных между собой вопроса.
Просто немного информации.
Дорожный бегун : while(not edge) { run(); }
Хитрый Койот : 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