Оператор goto — це оператор управління потоком виконання програм, який змушує центральний процесор виконати перехід з однієї ділянки коду в іншу (тобто здійснити стрибок). Інша ділянка коду ідентифікується за допомогою лейбла. Наприклад:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#include <iostream> #include <cmath> // для функції sqrt() int main() { double z; tryAgain: // це лейбл std::cout << "Enter a non-negative number: "; std::cin >> z; if (z < 0.0) goto tryAgain; // а це оператор goto std::cout << "The sqrt of " << z << " is " << sqrt(z) << std::endl; return 0; } |
У цій програмі користувачеві пропонується ввести додатне число. Однак, якщо користувач введе від’ємне число, то програма, використовуючи оператор goto, виконає перехід назад до лейблу tryAgain
. Потім користувачеві знову потрібно буде ввести число. Таким чином, ми можемо постійно просити користувача ввести число, поки він не зробить це коректно.
Раніше ми розглядали два типи області видимості: локальна (або ще “блокова”) і глобальна (або ще “файлова”). Лейбли використовують третій тип області видимості: область видимості функції. Оператор goto і відповідний лейбл повинні знаходитися в одній і тій же функції.
Існують деякі обмеження на використання операторів goto. Наприклад, ви не зможете перестрибнути вперед через змінну, яка ініціалізована в тому ж блоці, що і goto:
1 2 3 4 5 6 7 8 |
int main() { goto skip; // стрибок вперед заборонений int z = 7; skip: // лейбл z += 4; // яке значення буде в цій змінній? return 0; } |
Загалом програмісти уникають використання оператора goto в C++ (і в більшості інших високорівневих мов програмування). Основна проблема з ним полягає в тому, що він дозволяє програмісту керувати виконанням коду так, що точка виконання може довільно переміщуватися в коді. А це, в свою чергу, створює те, що досвідчені програмісти називають «спагетті-кодом». Спагетті-код — це код, порядок виконання якого нагадує тарілку зі спагеті (все заплутано і закручено), що вкрай ускладнює слідування та розуміння логіки виконання такого коду.
Як казав один відомий фахівець в інформатиці та в програмуванні, Едсгер Дейкстра: «Якість програмістів — це функція щільності використання операторів goto в програмах, які вони пишуть».
Оператор goto часто використовується в деяких старих мовах програмування, таких як Basic чи Fortran, або навіть в C. Однак в C++ goto майже ніколи не використовується, оскільки будь-який код, написаний з ним, можна більш ефективно переписати з використанням інших об’єктів в C++, таких як цикли, обробники винятків або деструктори (це все ми розглянемо у відповідних уроках).
Правило: Уникайте використання операторів goto, якщо на це немає вагомої причини.