Какие языки имеют структуру управления типами while-else и как она работает? - PullRequest
3 голосов
/ 01 апреля 2010

Давным-давно, я думал, что видел предложение добавить предложение else к for или while циклам в C или C ++ ... или что-то в этом роде. Я не помню, как это должно было работать - было ли выполнено предложение else, если цикл завершился нормально, но не с помощью оператора break?

В любом случае, это сложно найти, поэтому я подумал, что, возможно, я смогу получить здесь несколько ответов CW для разных языков.

Какие языки поддерживают добавление предложения else к чему-либо, кроме оператора if? В чем смысл этого пункта? Один язык за ответ, пожалуйста.

Ответы [ 3 ]

8 голосов
/ 01 апреля 2010

Python .

Пример использования:

for element in container:
  if element == target:
    break
else:
  # this will not be executed if the loop is quit with break.
  raise ElementNotFoundError()

Из документов Python :

выполняется когда цикл заканчивается исчерпанием список (с for) или когда условие становится ложным (с while), но не когда цикл завершается разрывом утверждение.

3 голосов
/ 01 апреля 2010

Существует так называемая «петля Дейкстры» (также называемая «охраняемая петля Дейкстры»). Он был определен в Охраняемый командный язык (GCL) . Вы можете найти некоторую информацию о его синтаксисе и семантике в вышеупомянутой статье Википедии в разделе 6 Повторение: do .

В настоящее время я на самом деле знаю один язык программирования, который напрямую поддерживает эту структуру управления. Это Оберон-07 (PDF, 70 КБ). И он поддерживает «петлю Дейкстры» в форме оператора while. Посмотрите на раздел 9.6. Хотя заявления в вышеуказанном PDF.

WHILE m > n DO m := m – n 
ELSIF n > m DO n := n – m 
END
1 голос
/ 14 мая 2013

Интересно, что ни Python, ни конструкция Oberon не являются теми, которые я искал. В C я часто обнаруживаю, что часто хочу получить конструкцию «иначе» или «в другом месте», которая выполняется только в том случае, если цикл не был взят. Может быть, это конструкция, которую вы ищете?

Так что вместо:

if (condition) {
   do {
       condition = update(something);
   } while (condition);  
} else {
   loop_never_taken(something);
}

Я мог бы написать:

while (condition) {
    condition = update(something);
} otherwhile {
    loop_never_taken(something);
}

Это определенно короче, и мне было бы намного понятнее читать. Он даже легко переводится в (псевдо) сборку:

    while: test condition
           bz elsewhile
     loop: push something    
           call update
     test: test condition
           bnz loop
           jmp done         
elsewhile: push something
           call loop_never_taken
     done: ...

Я чувствую, что это достаточно базовая структура, которая заслуживает немного больше сахара. Но, видимо, не было успешных языковых дизайнеров, которые бы полагались на эту структуру так сильно, как я. Интересно, сколько я должен прочитать в это!

...