Ни в C, ни в C ++ нет помеченного оператора break (вы, вероятно, используете расширение языка, а не стандартное C).
Вместо этого вы можете использовать goto
для выхода из вложенного цикла.
while (a)
{
while(b)
{
while (c)
{
if(d)
goto break_b;
}
}
break_b:
// ...
}
Я смог использовать goto для решения этой проблемы ... Я думал, что это была запрещенная конструкция в c ++?
Нет.goto
не «забанен» в C ++.
Это совершенно хороший способ использования goto
.Не существует эквивалентного структурированного управляющего оператора.
lambdas / closures [...] потенциально позволили бы мне сделать это, но я не совсем уверен, как они будут работать в этомcase.
Если у вас аллергия на goto
, тогда вы действительно можете использовать лямбду, но я не вижу в ней дополнительной читабельности:
while (a)
{
[&](){
while(b)
{
while (c)
{
if(d)
return;
}
}
}();
// ...
}
Вместолямбда, вы можете использовать именованную функцию.Но в этом случае вам нужно передать любые переменные (такие как b
, c
и d
) в качестве аргументов (при условии, что они не глобальные).
Еще один способ - этодополнительная переменная:
while (a)
{
bool break_b = false;
while(b)
{
while (c)
{
if(d) {
break_b = true;
break;
}
}
if (break_b)
break;
}
// ...
}
Из этих трех методов я рекомендую goto
, поскольку он наиболее читабелен.За исключением случая, когда фактический внутренний цикл, опущенный в примере, очень длинный, в этом случае отдельная функция может быть лучше.