Как связаны C++, goto и обезьяны

Судя по неожиданно бурной реакции некоторых пользователей DTF на мои предыдущие посты, они очень хотят защитить меня от применения goto в C++. И даже готовы ради этого меня побить, лишь бы не случилось немыслимое и в программах на C++ не появилось бы goto. Реальных аргументов в пользу того чтобы не учиться пользоваться goto они привести не в состоянии, но их ведь учили что goto использовать совсем нельзя, иначе небо упадет на землю, а горы превратятся в пепел и улетят по ветру как осенние листья.

Как связаны C++, goto и обезьяны

Это все напомнило мне одну замечательную историю про обезьян. Я не помню всех деталей, поэтому расскажу ее как помню, а как было на самом деле вы можете найти в интернете и написать в комментариях.

Посадили ученые в клетку стаю обезьян, подключили к клетке землю, а с потолка свесили банан в проволочной сетке, на которую подали фазу. Обезьяны банан увидели и полезли по прутьям его добывать. Схватится обезьяна за банан, а ее током как долбанет. Обезьяна, ясное дело страдает, остальные над ней ржут, ученые тоже с интересом наблюдают…

И вот через пару дней обезьяны уже все поняли про этот банан и даже смотреть на него перестали. Тогда ученые одну обезьяну из клетки выселили а вместо нее другую заселили. Она банан увидела и хотела за ним полезть, но обезьяны очень умные и заботливые, они все сразу поняли что сейчас эту новенькую обезьяну током ударит, поэтому они ее стали от этого оберегать как умеют: держать, махать руками, даже побили как следует — в общем, все для ее блага сделали, лишь бы ее током не ударило. Очень они заботливые были, добились того, чтобы новая обезьяна к банану не притронулась.

Шло время, ученые по одной заменили всех старых обезьян, которые знали что будет если потрогать банан. Обезьяны исправно заботились друг о друге, выбивая из новоприбывших всякое желание трогать бананы, которые вывешивали ученые. И вот уже ни одна обезьяна не знала, почему банан трогать нельзя. Из новых обезьян исправно выбивали всяческое желание трогать банан, потому что трогать банан нельзя никогда, в точности как с goto вышло у них там.

22
22 комментария

Чувак, goto реально не нужен. Он снижает уровень читаемости кода и не даёт буквально никаких преимуществ. В нормальных языках программирования такого оператора вообще нет, и хорошо.

6
Ответить

Я считаю нормальными языками только C++, C и C#, причем последний в меньшей степени. Выходит, во всех нормальных языках есть goto.

Ответить

Тот самый неловкий момент, когда не знал или напрочь забыл, что во всех этих Сях вообще есть goto, ибо последний раз пользовался им 30 лет назад при написании программ для Спектрума на Бейсике... О_о

1
Ответить

А как ты выходишь из вложенных циклов?

Ответить

Ждем 11-мерный движок для игр со всем что только можно только из goto и if. Банан-то все забыли почему трогать нельзя, может уже самое то начать попытки его съесть. Без функций, разумеется - зачем они?

Ответить

Я джун, пробую писать всякие интерпретаторы и среды разработки.
И у меня уже возникали моменты, когда без goto никак.

1
for(int i = 0; i < n; i++)
for(int i2 = 0; i2 < n; i2++)
Как выйти сразу из двух и более циклов? Иногда ломаю условие предыдущего цикла, т.е. i2 = n и i = n. Но, когда требуется максимальная производительность, приходится выходит с goto.

2
switch не даёт прыгать на свои кейсы из самого же switch, хотя они - самые обычные метки для прыжка. Это дикость.
Пришлось городить уродство:
switch(n)
case А:
case_а:
код
case Б:
код
case В:
код
goto case_а;
код
case Г...
При этом логика кода никак не давала поставить А ниже В, чтобы можно было просто провалится в него, я пытался.

3
Надо было определить что под курсором. А под ним может быть любой объект, каждый со своим массивом или структурой. Т.е. нельзя просто пройти по одному массиву/структуре.
Сначала перед каждым массивом/структурой стояло "if(объект_не_найден)", но требовалась производительность (поиск идёт всегда при движении курсора), поэтому проходим по всем и при нахождении просто прыгаем на выход, на конец всех поисков.

Ответить

4
while(true){
switch(n){
case А
case Б
...
}}
Когда кейсов мало, делаю if else вместо switch, чтобы break выводил из while.
Но если их много, то приходится использовать switch и goto, иначе код с кучей if else усложняется для понимания.

Ответить