Если вы не можете расположить логику так, чтобы break
во внутреннем цикле сразу переходил к продолжению внешнего цикла, сделайте следующее:
for (int i = 0; i<10; i++)
{
if (!valid(i)) continue;
for (int j = 0; j<5; j+=2)
{
if (!valid(i,j)) goto continue_i;
do_whatever_with_i_and_j()
}
more_stuff_here();
continue_i:
}
Там, я это сказал. Код короче, проще, легче для чтения и анализа, чем версия, которая устанавливает флаг, затем ломается, затем немедленно проверяет флаг снова и условно продолжается.
Другой вариант это
void inner_loop(int i) {
if (!valid(i)) return;
for (int j = 0; j<5; j+=2)
{
if (!valid(i,j)) return;
do_whatever_with_i_and_j()
}
more_stuff_here();
}
for (int i = 0; i<10; i++)
{
inner_loop(i);
}
Однако, в зависимости от того, что делает внутренний цикл, вы можете обнаружить, что создаете вполне механизм, который дает ему доступ ко всему, что он должен модифицировать.
Сообщество вики, потому что об этом (или подобных ситуациях) столько раз спорили на SO, что практически определяли «субъективное и аргументированное».