Повторение Паскаля ... пока против С не сделать ... пока - PullRequest
4 голосов
/ 02 июня 2010

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

Ответы [ 8 ]

9 голосов
/ 02 июня 2010

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

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

do {
    excitingThings();
} while ( !endOfTheWorld() );
4 голосов
/ 02 июня 2010

В С заявлении

 while(some_condition);

может быть либо циклом "ничего не делать", либо отделиться от цикла "делать ... пока".

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

 while(some_condition);

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

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

3 голосов
/ 02 июня 2010

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

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

3 голосов
/ 02 июня 2010

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

1 голос
/ 02 июня 2010

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

1 голос
/ 02 июня 2010

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

0 голосов
/ 02 июня 2010

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

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

0 голосов
/ 02 июня 2010

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

...