Разрыв в структуре с отступом цикла - PullRequest
0 голосов
/ 27 ноября 2011

В структуре цикла, такой как for, break; "знает", когда он находится под уровнем отступа?

Например:

for (i = 0; i < 10; i++) {
    for (s = 0; s <= i; s++) {
        if (s == 7) break;
    }
}

Будет ли это break;Остановить и для или только для внутреннего?

Спасибо

Ответы [ 6 ]

3 голосов
/ 27 ноября 2011

Вы не сказали, какой язык вы используете, но я никогда не видел языка с таким синтаксисом, который бы делал что-то кроме разрыва внутреннего цикла (позволяя продолжить внешнему). Тем не менее, вы действительно должны упомянуть, какой язык вы используете! : -)

Многие языки с таким синтаксисом поддерживают метки и направленные разрывы, которые можно использовать для прерывания внешнего цикла. Это обычно выглядит так:

outer: for (i = 0; i < 10; i++) {
    inner: for (s = 0; s <= i; s++) {
        if (s == 7) break outer;
    }
}

(Метка inner является необязательной в этом случае, потому что мы ее ни для чего не использовали, я просто включил ее для полноты.)

В этом примере будут нарушены как внутренние , так и внешние циклы. Это действительно в Java, JavaScript и, возможно, в других; в C вам понадобится метка после цикла и (вздрагивание) a goto, и вам, вероятно, будет лучше (возможно, всегда лучше), просто включив какое-то условие завершения в проверку внешнего цикла, что внутренний цикл наборы.

Вот живой пример в JavaScript (я использовал меньшие числа, чтобы сделать его более очевидным): Без направленного разрыва | С направленным разрывом .

Также обратите внимание, что в этих языках отступы не имеют никакого значения. Этот код точно тот же ваш код (только заметно менее читаемый):

for (i = 0; i < 10; i++) {
for (s = 0; s <= i; s++) {
if (s == 7) break;
}
}

Это также идентично (и резко менее читабельно):

        for (i = 0; i < 10; i++) {
    for (s = 0; s <= i; s++) {
if (s == 7) break;
    }
        }

Очевидно, что вы никогда не захотите этого делать, но дело в том, что отступы предназначены для людей, а не для компиляторов (в языках с таким стилем синтаксиса).

2 голосов
/ 27 ноября 2011

Это нарушит только внутренний цикл.

См. Документацию MSDN .

В циклах break прекращает выполнение ближайшего включающего оператора do, for или while.Управление переходит к оператору, который следует за завершенным оператором, если таковой имеется.

1 голос
/ 27 ноября 2011

Уровни отступов не имеют значения в языках, которые используют награды.Только внутренний цикл будет разорван.

0 голосов
/ 27 ноября 2011

Только внутренний. У некоторых языков есть способ выбрать, что сломать.

0 голосов
/ 27 ноября 2011

Только внутренний.Перерыв вырвется из одной петли.Вам нужна дополнительная логика, чтобы полностью разорвать вложенные циклы, иначе вы можете использовать return, если ваш вложенный цикл инкапсулирован в функцию.

0 голосов
/ 27 ноября 2011

Это остановит только внутренний.

...