2010-06-01 7 views
4

В C есть цикл while, а цикл (почти) эквивалентен повторением до цикла, но между ними существует небольшая разница, в то время как обе структуры будет итерации по крайней мере один раз и проверить, нужно ли снова выполнять цикл только в конце, в pascal вы записываете условие, которое необходимо выполнить для завершения цикла (REPEAT UNTIL something) в C вы пишете условие, которое необходимо выполнить продолжить цикл (DO WHILE something). Есть ли причина, почему есть эта разница или это просто произвольное решение?Повторение Паскаля ... до тех пор, пока против C не ... пока

+6

Вот несколько запасных, чтобы скопировать и вставить в ваш код: !!!!!!!!!!!! –

+0

Hellfreezeover: = false; REPEAT UNTIL Hellfreezeover –

ответ

0

Я всегда нашел UNTIL петлями назад, но это может быть просто из-за того, что я на фоне C. Есть такие современные языки, как Perl, которые предоставляют оба варианта, но нет особого преимущества для одного из них.

+0

Я лично также считаю, что версия C имеет больше смысла, и я исхожу из фона паскаля, поэтому я обнаружил, что написал неправильное условие в C, как только начал изучать C. – Bob

3

Я не уверен в исторических влияниях, но, на мой взгляд, C более последователен в том смысле, что if s требуется условие true для кода для запуска, также как и while s и do while s.

+0

и 'for' , в этом отношении. – caf

8

Нет фундаментальной разницы вообще, и нет преимущества для одного над другим. Это просто «синтаксический сахар» - это изменение синтаксиса языка, которое никак не меняет его поведение. Некоторые люди находят «повторять до тех пор, пока» легче концептуализировать, в то время как другие находят «повторять пока» легче.

Если в C, вы столкнулись с ситуацией, когда «до» не то, что это желание, вы всегда можете просто свести на нет условие:

do { 
    excitingThings(); 
} while (!endOfTheWorld()); 
+12

+1 для проверки, не закончился ли мир. – Bob

+0

По крайней мере, мы все делаем одно excitingThings: D – Nyan

1

Это просто произвольное решение. На некоторых языках есть и то, и другое. Оператор QBASIC/VB DO...LOOP поддерживает все четыре комбинации предварительного теста/posttest и WHILE/UNTIL.

1

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

4

В C заявление

while(some_condition); 

может быть либо «ничего не делать» петли или, возможно, отделились от «делать ... в то время как» цикл.

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

while(some_condition); 

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

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

+1

Я использую 'while (cond) continue;', чтобы было ясно, что тело цикла пусто. –

+0

@Loadmaster - хорошая идея - я мог бы принять это для своего собственного кода. – Dipstick

+0

@ChrisHarris: Да, пустое выражение (голодная точка с запятой) для тела цикла - это ошибка, ожидающая своего появления. Плохой стиль кода. –

0

Синтаксис C не требует дополнительных ключевых слов.

В C два ключевых слова do и while работают для двух видов петель. Паскалю требуется четыре ключевых слова: while, do, repeat и until.

+0

Вам понадобится только 1 ключевое слово. 'while' для предварительного условия, либо' repeat', либо 'do' и' until' для postcondition –

+1

С другой стороны, C перерабатывает ключевые слова, что потенциально приводит к путанице. См. Сообщение ChrisHarris –

3

Проект Pascal был частично мотивирован работой по структурированному программированию 1960-х годов, включая новаторскую работу Эдсгера Дейкстры A Discipline of Programming. Дейкстра (тот же человек, который считал вредным) изобрел методы для создания программ, которые были правильными по конструкции.Эти методы включают в себя способы записи петель, которые фокусируются на постулате , установленном при завершении цикла. Создавая форму repeat... until, Вирт был вдохновлен Дейкстра, чтобы сделать условие завершения, а не его дополнение, явным в коде.

Я всегда восхищался языки, как Smalltalk и иконы, которые предлагают две синтаксических форм, что позволяет программисту выражать свое намерение ясно, без того, чтобы полагаться на легко пропущенный операторе комплемента. (В значке формы while e1 do e2 и until e1 do e2; в Smalltalk они block1 whileTrue: block2 и block1 whileFalse: block2.) С моей точки зрения ни C, ни Pascal не являются полностью построенным, ортогональным дизайном.

+0

Итак, возьмите perl, у него есть даже дополнение 'if', которое является' if', и вы можете разместить их перед заявлением или после него. Но ортогональность perl на самом деле не является преимуществом. –

+0

+1, при условии, что обе формы на языке допускают более читаемый код. – Artelius

Смежные вопросы