У цій темі ми розглянемо приклади ефективного використання goto
C або C ++. Це надихається відповіддю, яку люди проголосували, бо думали, що я жартую.
Короткий зміст (мітка змінена з оригінальної, щоб зробити намір ще чіткішим):
infinite_loop:
// code goes here
goto infinite_loop;
Чому це краще, ніж альтернативи:
- Це конкретно.
goto
- це мовна конструкція, яка викликає безумовну гілку. Альтернативи залежать від використання конструкцій, що підтримують умовні гілки, з виродженим завжди істинним станом. - Етикетка документує намір без зайвих коментарів.
- Читачеві не потрібно сканувати проміжний код на ранні
break
s (хоча все ще можливо для безпринципного хакера симулюватиcontinue
з ранньоюgoto
).
Правила:
- Робіть вигляд, що готофоби не перемогли. Зрозуміло, що вищезазначене не можна використовувати в реальному коді, оскільки це суперечить усталеній ідіомі.
- Припустимо, що всі ми чули про "Goto вважається шкідливим" і знаємо, що goto можна використовувати для написання коду спагетті.
- Якщо ви не згодні з прикладом, критикуйте його лише з технічної точки зору («Тому що люди не люблять goto» - це не технічна причина).
Давайте подивимось, чи можна говорити про це як про дорослих.
Редагувати
Здається, це питання зараз закінчене. Це дало кілька високоякісних відповідей. Дякую всім, особливо тим, хто серйозно сприйняв мій маленький приклад. Більшість скептиків були стурбовані відсутністю блоку блоків. Як зазначив @quinmars у коментарі, ви завжди можете розмістити фігурні дужки навколо тіла циклу. Зауважу принагідно , що for(;;)
й while(true)
не дають вам брекети безкоштовно або для (і опускаючи їх може викликати прикрі помилки). У будь-якому разі, я більше не буду витрачати на це дрібницю вашу силу мозку - я можу жити з нешкідливим і ідіоматичним for(;;)
і while(true)
(так само добре, якщо хочу зберегти свою роботу).
Беручи до уваги інші відповіді, я бачу, що багато людей розглядають goto
як те, що ти завжди повинен переписати по-іншому. Звичайно, ви можете уникнути a goto
, ввівши цикл, додатковий прапор, стек вкладених if
s або що завгодно, але чому б не подумати, чи goto
це, мабуть, найкращий інструмент для роботи? Іншими словами, скільки потворності готові витерпіти люди, щоб уникнути використання вбудованої мовної функції за призначенням? Я вважаю, що навіть додавання прапора є занадто високою ціною, яку потрібно заплатити. Мені подобається, щоб мої змінні представляли речі в доменах проблеми чи рішення. "Тільки щоб уникнути goto
" не вирізає.
Я прийму першу відповідь, яка дала шаблон C для розгалуження до блоку очищення. ІМО, це робить найбільш вагомий випадок goto
з усіх розміщених відповідей, звичайно, якщо ви вимірюєте це за викривленнями, які ненависник повинен пройти, щоб уникнути цього.