Оператор goto
Оператор goto выполняет безусловный переход к метке с указанным именем.
Метка - это идентификатор, за которым следует двоеточие, размещённый внутри той же
функции, где находится сам оператор. Переход происходит мгновенно: весь код между
оператором goto и меткой пропускается, а выполнение продолжается с первой
инструкции после метки. Оператор принимает единственный параметр - имя метки,
к которой нужно перейти.
Использование goto считается плохой практикой, так как нарушает структуру
программы и затрудняет чтение кода. В большинстве случаев его можно заменить
циклами, условиями или функциями.
Синтаксис
goto label;
// ...
label:
// код, начиная с этой строки
Метка должна находиться в той же функции, что и оператор goto.
Прыжок между разными функциями невозможен.
Пример
Давайте выполним переход вперёд, пропустив часть кода:
#include <iostream>
using namespace std;
int main()
{
cout << "start" << endl;
goto skip;
cout << "this is skipped" << endl;
skip:
cout << "end" << endl;
return 0;
}
Результат выполнения кода:
"start"
"end"
Пример
Давайте используем goto для выхода из вложенных циклов:
#include <iostream>
using namespace std;
int main()
{
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (i * j == 6) {
cout << i << " " << j << endl;
goto out;
}
}
}
out:
cout << "done" << endl;
return 0;
}
Результат выполнения кода:
2 3
"done"
Пример
Давайте выполним переход назад, организовав повторение кода:
#include <iostream>
using namespace std;
int main()
{
int count = 0;
loop:
cout << count << endl;
count++;
if (count < 3) {
goto loop;
}
return 0;
}
Результат выполнения кода:
0
1
2