Скажем, у нас есть следующий код, и когда мы прерываем, мы хотим вырваться из внутреннего и внешнего циклов вместо внутреннего цикла и перейти непосредственно к blablabla. Как мы можем это сделать в C++?
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (some condition) {
// Do something and break...
break; // Breaks out of the inner loop
}
}
}
blablabla
...
"Идите прямо к [...]" звучит как идеальная работа для goto
. И это !
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (some condition) {
// Do something and break...
goto afterLoop; // Breaks out of both loops
}
}
}
afterLoop:
// More stuff
goto
недоброжелателей «s. Догмы.
Существует два способа его решения:
Решение 1: используйте логическое подтверждение вместо второго цикла
for (int i = 0; i < m; i++) {
int j = 0;
bool conditionOut=false;
while (!conditionOut && j<n)
{
if (some condition)
{
conditionOut =true;
break;
}
}
}
Решение 2: используйте goto (Stroustrup упоминает его как единственное из немногих примеров, где goto полезен в C++)
Вы можете извлечь циклы в отдельную функцию и использовать return
.
void doTheLoop(int n, int m) {
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (some condition) {
// Do something and break...
return;
}
}
}
}
doTheLoop(n, m);
//blablabla ...
Например
for ( int i = 0; i < m; i++ )
{
bool exit = false;
for ( int j = 0; !exit && j < n; j++ )
{
if ( ( exit = some condition ) )
{
// Do something and break...
}
}
if ( exit ) break;
}
Или
bool exit = false;
for ( int i = 0; !exit && i < m; i++ )
{
for ( int j = 0; !exit && j < n; j++ )
{
if ( ( exit = some condition ) )
{
// Do something and break...
}
}
}
Вы можете построить переменную проверку во внешнем цикле, скажем:
bool end;
Во внутреннем цикле, в какой-то момент, вы хотите вырваться и установить конец в true. Вам также нужно условие if.
Используйте другую переменную int.
for (int i = 0, Out = 0; i < m && Out == 0; i++) {
for (int j = 0; j < n && Out == 0; j++) {
if (some condition) {
Out = 1;
}
}
}
Вы можете использовать "goto" для этих целей.