Как да break-вам от няколко цикъла на веднъш


1
Здравейте. При положение, че съм създал един for цикъл и след това в тялото му, друг for цикъл и искам от тялото на втория for цикъл да излеза и от двата на веднъж, как мога да го направя. Благодаря.



Отговори



3

Според мен goto си е лоша практика. Колкото до continue и break - няма нищо лошо в тях. Предложението за булева променлива, която да се проверява в най-външния цикъл е най-добро, според мен. Например:

 for (int i = 0; i < 100; i++) {
     if (found) {
         break;
     }
     for (int j = 0; j < 100; j++) {  
         if (j == searchedValue) {
             found = true;
             break;
         }
     }
 }

 


от dzhenko (3893 точки)


1
Това е най-културния начин. Не ползвайте goto никога, не пипайте индексите също, ако искате да сте в качествения код. Ако можете изнесете в метод и там правете проверките и връщайте с return.

от ivaylo.kenov (30760 точки)


5
Ако циклите са в метод и имаш такава възможност най-добре използвай return.
Иначе ти трябва флагова променлива и когато се случи даденото събитие променяш флага (във вътрешния цикъл) и съответно го спираш и веднага след края му (на вътрешния) проверяваш флага и ако той е истина т.е. трябва да спреш циклите спираш и външният (break).

от Vali0 (1139 точки)


-1
Благодаря. Има и още един начин, току що ми го казаха ето го и негоsearch: // break label for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { if (j == 5) { break search; // break j and i } } }

от sportsman (195 точки)

0
Можеш и да го модифицираш до два while цикъла с един condition




1
for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { if (j == 5) {
i=11; break; } } }

от bgotov (1559 точки)


0
Не е добра практика да се пипат управляващите променливи на цикъла извън стандартното им обновяване. По добре да се ползва булева променлива, която да се проверява веднага след вътрешния цикъл и ако е true да брейква външния.

от ivand (862 точки)

0
то въобще не е добра практика да се брейква директно от най вътрешния цикъл. Значи логиката не е добре структуриране, поне на мен един път не ми се е налагало досега да брейквам 2-3 вградени цикъла накуп

от bgotov (1559 точки)


1
Това е един от малкото случаи в които goto е полезно.

от nikolap (555 точки)


0
май няма случай, в който goto да е полезен....е освен ако не пишеш на асемблер :)


0
В асемблерите няма GO To, има JMP
:)

от ellapt (6303 точки)



3
Цикъла for е за завъртане точно определен брой пъти. Break (и отчасти continue) са "патерици", нещо като goto. Те "чупят" логиката на цикъла. Като видиш for (i =0, i < 20, i++) очакваш този цикъл да се изпълни точно 20 пъти, а не един път 20, друг път 5.
Както казаха по-горе колегите ползвай 2 while цикъла, или външен while и вътрешен for. Това ще е по-добре за схващане на кода от един поглед.

от JulianG (5316 точки)