Концепция заключается в том, чтобы разрешить использование нескольких операторов `break` и опционального оператора `continue` в одной строке, как показано ниже:
while (cond1) // возврат сюда из: break, continue
{
while (cond2)
{
if (cond3)
{
break, break; // выход из внутреннего и внешнего цикла
}
else if (cond4)
{
break, continue; // выход из внутреннего цикла и продолжение во внешнем цикле
}
}
// этот код выполняется только если !cond2
}
// код выполнен после "break, break" или если !cond1
while (cond1) // возврат сюда из: break, continue
{
switch (item)
{
case value1:
break, break; // выход из switch и внешнего цикла
case value2:
break, continue; // выход из switch и продолжение во внешнем цикле
default:
break;
}
// этот код выполняется только если был default
}
// код выполнен после "break, break" или если !cond1
Операторы `break` могут завершать выполнение циклов или блоков `switch case`. Количество операторов `break` ограничено количеством вложенных областей, из которых можно выйти, тогда как оператор `continue` может быть только один и должен быть последним в последовательности.
Формальное определение (subj):
break [, break]... [, continue]
Это означает, что внутри блока кода могут использоваться несколько операторов `break` и опционально `continue` в конце. Ни один из них не обязателен, что обеспечивает полную обратную совместимость.
Обычно альтернативы этому подходу включают управление несколькими флагами, подобное конечному автомату, распределённому между локальными переменными, а также множество операторов `if`, чтобы обработать условия в нужном месте. Это может усложнить как код, так и его читаемость.
Кроме того, поскольку каждый оператор (`break`, `continue`) является отдельным словом, они могут подсвечиваться в IDE, показывая свою связь с соответствующим блоком (`for`, `foreach`, `while`, `switch`, `do`). Во время отладки эти операторы могут выполняться по одному, подобно тому, как выполняется код внутри `for (statements)`, с независимой подсветкой каждой части строки.
Если вам знакома эта боль, приглашаю поддержать на:
https://github.com/dotnet/csharplang/discussions/8434 (стрелкой вверх)
Здравствуйте, Caracrist, Вы писали:
C> Концепция заключается в том, чтобы разрешить использование нескольких операторов `break` и опционального оператора `continue` в одной строке, как показано ниже:
C> break, break; // выход из внутреннего и внешнего цикла
Выглядит оригинально, но непрактично. Когда начнутся модификации кода, меньше всего прогеру хочется рефакторить всю эту ересь.
Уже давно придуманы (в языке D ) break LABEL и continue LABEL. Работают безотказно.
Здравствуйте, m2user, Вы писали:
M>labeled loops в Java — лучше.
А ещё лучше
именнованые блоки Nemerle.
Вроде как давно не упоминался всуе.
Здравствуйте, Caracrist, Вы писали:
C>Концепция заключается в том, чтобы разрешить использование нескольких операторов `break` и опционального оператора `continue` в одной строке, как показано ниже:
Освой концевую рекурсию и проблем с циклами у тебя не будет в любом языке где поддерживается её оптимизация (или если количество переборов циклах не велико и не может переполнить стек).
if (cond1)
outerLoop();
// код выполнен после "break, break" или если !cond1
return;
void outerLoop()
{
if (innerLoop() && cond1)
outerLoop(); // концевая рекурсия внешнего цикла (возврат сюда из: break, continue)
bool innerLoop()
{
if (cond3)
return false; // выход из внутреннего и внешнего цикла
else if (cond4)
return true; // выход из внутреннего цикла и продолжение во внешнем цикле
if (cond2)
return innerLoop(cond2); // концевая рекурсия вложенного цикла
// этот код выполняется только если !cond2
return true;
}
}