Оператор 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 майже ніколи не використовується, оскільки будь-який код, написаний з ним, можна більш ефективно переписати з використанням інших об’єктів, таких як цикли, обробники винятків або деструктори (це все ми розглянемо на відповідних уроках).
Правило: Уникайте використання операторів goto, якщо на це немає вагомих причин.
