Как говорили другие (или, по крайней мере, подразумевается ): после ввода (самого крайнего) for
l oop † , переменная, i
, будет увеличен в конце этого l oop, до условия, проверенного, чтобы увидеть, должен ли быть запущен другой l oop ...
... что если вы не «выпрыгнете» из l oop, используя оператор break
!
Итак, следующий слегка измененный код будет не увеличение i
(вообще), если found
становится true
во время первой итерации самой внешней l oop:
int i;
for (i = 0; !found && i < f_i.size(); i++) {
for (unsigned int j = 0; !found && j < f_g.size(); j++) {
for (unsigned int k = 0; !found && k < f_g.size(); k++) {
///Do Stuff
found = (/*Condition that's fulfilled after 2 iterations on k*/);
}
}
// If "found" becomes true, exit the loop immediately, AVOIDING THE INCREMENT:
if (found) break;
}
Итак, в то время как другие ответы очень хороши, и код Решения, которые они предлагают, совершенно верны, предложение здесь - это гораздо более «минимальная» корректировка вашего кода. Я надеюсь, что это помогает.
Примечание. Конечно, вы можете добавить аналогичные операторы break
во внутренние циклы; однако, поскольку ваши переменные j
и k
объявлены локально для этих циклов, может показаться, что нежелательные приращения их значений не имеют значения. Кроме того, break
нельзя использовать для выпрыгивания из нескольких вложенных циклов.
† Также следует учитывать, что если переменная found
равна true
перед самым внешним for
l oop встречается, что l oop не будет выполняться (очевидно) и, таким образом, переменная i
не будет увеличиваться в этом случае.