Паскаль повторяет до тех пор, пока C не делает, пока

В C есть цикл do while, а его (почти) эквивалент в паскале — это цикл repeat until, но между ними есть небольшая разница, в то время как обе структуры будут выполнять итерацию хотя бы один раз и проверять, нужно ли им снова выполнять цикл, только в конец, в паскале вы пишете условие, которое необходимо выполнить, чтобы завершить цикл (ПОВТОРЯТЬ ДО чего-то), в C вы пишете условие, которое необходимо выполнить, чтобы продолжить цикл (ДЕЛАТЬ, ПОКА что-то). Есть ли причина, по которой существует эта разница, или это просто произвольное решение?


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 {
  statement;
  statement;
  statement;
  lots more statements;
 }

 while(some_condition);

Использование другого ключевого слова — «до» — позволяет избежать этого возможного неправильного толкования.

Не такая уж проблема в наши дни, когда все включают все предупреждения компилятора и обращают на них внимание, не так ли? Тем не менее, я подозреваю, что большинство программистов-ветеранов C пожелали - в то или иное время - чтобы C использовал "until" в этом случае.

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 более последователен в том смысле, что if требует, чтобы условие было истинным для запуска кода, как и while и do while.

person Artelius    schedule 01.06.2010

Дизайн 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 не являются полностью построенным ортогональным дизайном.

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 поддерживает все четыре комбинации предварительного/послетестового тестирования и WHILE/UNTIL.

person dan04    schedule 01.06.2010

Не было никакого «решения», которое каким-либо образом связывало бы поведение цикла repeat/until в Паскале с поведением цикла do/while в C, ни преднамеренного, ни произвольного. Это просто два совершенно не связанных между собой вопроса.

person AnT    schedule 01.06.2010

Просто немного информации.

Дорожный бегун : while(not edge) { run(); }

Хитрый Койот : 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 имеет больше смысла, и я пришел из Pascal, поэтому я обнаружил, что написал неправильное условие на 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 повторно использует ключевые слова, что может привести к путанице. См. пост Криса Харриса - person Marco van de Voort; 05.06.2010