goto або як телепортуватися в С++

Переглядаючи фільми про супергероїв, ми теж мріємо про якісь цікаві здібності. «От якби я вмів літати…», «Будь я безсмертним, я б…», «Якби я вмів телепортуватися, то б побував би у всіх країнах світу», «Якби можна подорожувати у часі…». Боюсь уявити, скільки всього ви ще можете придумати і як це б використовували.

Але зараз я запалю вогник заздрощів. У теж є своєрідна телепортація! Хтось може сказати, що подорожує у часі та просторі коду, але це вже не так важливо. Запитаєте, як таке можливо? Та насправді доволі просто. Давайте розберемося!

Що я маю на увазі під словом «телепортація» в Буквально. Переміщення з однієї точки програми в іншу. Для цього потрібно створити дві точки. Перша символізує місце, куди ми переміщуємося (мітка повернення), а друга - звідки ми переміщуємося (мітка відправлення).

		
			#include <iostream>

			int main()
			{
				system("chcp 1251 > nul");
				std::cout << "Текст до мітки відправлення\n";
				goto moving_point; //місце звідки ми переходимо до мітки moving_point
				std::cout << "Текст знаходиться між мітками переміщення\n";
				moving_point: //місце куди ми потрапимо
				std::cout << "Текст знаходиться після мітки повернення\n";

			}
			
			

Створення «телепорту» відбувається за таким принципом:

1) Оператор переходу записується як

2) Мітка повернення записується як

Звісно, що ви маєте повне право записувати їх у довільному порядку. Наприклад, ми вже з вами вивчили цикли знаємо, що один і той самий код може виконуватися декілька разів. І за допомогою можна реалізувати поведінку, схожу на цикл. Розглянемо це на прикладі:

		
				#include <iostream>

                int main()
                {
					system("chcp 1251 > nul");


					std::cout << "for: \n";
					//робимо вивід чисел від 1 до 5 за допомогою циклу for
					for (int i = 1; i <= 5; i++)
						std::cout << i << " ";

					std::cout << "\n\n";
					//робимо вивід чисел від 1 до 5 за допомогою телепорту
					int k = 1;

					std::cout << "goto:\n";
					moving_point:
					std::cout << k << " ";
					k++;
					if (k <= 5) //умова за якої ми здійснимо телепортацію
						goto moving_point;
                }
			
			

Зверніть свою увагу, що ми робили умову для телепортації. Це потрібно не тому, що змінна повинна мати обмеження. Умова потрібна для того, щоб виконання програми не зациклилося.

Хоча за допомогою можна відтворити роботу циклів або навіть умовних конструкцій, робити так у реальних програмах не рекомендується. Сучасна мова має спеціальні конструкції які роблять код зрозумілішим, безпечнішим і легшим для підтримки. Саме тому сьогодні використовується дуже рідко.

Ось ви і почули про першу небезпеку. Якщо неправильно вказати обмеження або взагалі її не додати, то телепортація може бути вічною чи взагалі не відбуватиметься.

Друга небезпека - ускладнення коду. У реальних програмах ви рідко використовуватимете телепортацію. Часто легше взагалі не використовувати ніж використати його й зламати логіку програми. Адже точки входу та виходу можуть бути далеко одна від одної й встежити за ними - ще та задачка.

Важливо! Мітка повинна знаходитися в межах тієї самої функції. Не можна за допомогою перейти до мітки, що знаходиться в іншій функції.

		
			#include <iostream>

			void secondFunction()
			{
				label:
				std::cout << "Ми у другій функції\n";
			}

			int main()
			{
				system("chcp 1251 > nul");
				std::cout << "Початок програми\n";

				// ПОМИЛКА!
				goto label;

				return 0;
			}
			
			

Компілятор видасть помилку, адже мітка знаходиться в іншій функції. Оператор може переходити лише до міток, які оголошені в межах тієї самої функції.

Звісно, вам не вдасться важливі моменти коду (наприклад ініціалізацію змінних). В таких випадках ми отримаємо очевидну помилку:

		
			#include <iostream>

			int main()
			{
				system("chcp 1251 > nul");

				int x;
				goto moving_point;

				x = 5;

				moving_point:
				std::cout << x;

			}
			
			



Ви повинні увійти, щоб залишати коментарі.


Коментарі: