Дали goto е опасен оператор: краткият отговор е "да".
Със goto сме в разпра,
но ти не разбирай че мразя аз goto:
Напротив! Напротив!
Дори на Лисп да пиша,
любиния goto аз пак ще обичам,
аз пак ще обичам...
Но нека се обоснова по-непоетично.
В съвременното (бизнес) програмиране, се набляга най-много на четимоста и разбираемостта на кода. Обикновено проектите се пишат от колектив и е от критична важност един програмист светкавично да се ориентира в творчеството на колегите си. Това включва единна концепция за построяването на кода, единен начин на записване на заявки и не на последно място единен начин на форматиране на кода.
Това повишаване на четимостта на кода намалява неговата ефективност. И обратно, реализиране на алгоритъм за конкретна задача обикновено е много по-ефективен от използване на стандартни библиотечни функции, но значително намялява четимостта. Особено, когато липсват коментари ;)
Проблемът с goto e, че той е оператор от най-ниско ниво, т.е той се превежда директо в една единствена инструкция на процесора или виртуалната машина. Като такъв, неговото използване може много лесно да наруши логиката, изградена с операторите от по-високите нива (операторите на езика за програмиране и подпрограмите в кода или библиотеките).
Предимството на goto e, че той е оператор от най-ниско ниво. В ръцете на опитен пограмист (наблягам на опитен, с идеята че ще състави качествен код, за който няма да се появи нужда да бъде поправян от някой друг ! ), goto може да доведе до невероятни подобрения в скорост и памет (например понижаване на сложността на алгоритъм от O(n^2) до O(n.log(n)).
Най-важното е да се наблегне къде трябва и къде не е препоръчително да се използва goto.
В бизнес приложения, в които клиента може да си позволи машина с достатъчно изчислителна мощ и памет, и където скоростта на изпълнение на програмата не е критично важна, не е добра практика да се използва goto.
Но ако ще пишем драйвери и модули за ядро на ОС (например ;) ) където скоростта на изпълнение е важен фактор, goto е безценен помощник.
И все пак, в практиката най-много ми се е налагало да използвам goto, за да изляза от вложен цикъл направо извън тялото на външния. В Java има решение на този проблем: break и continue в комбинация с етикети.
@Tosh: в малко известният, но иначе много интересен език C-- (не се шегувам,
http://c--sphinx.narod.ru/indexe.htm) реализирани оператори break n; и continue n; където n е брой нива от вложени цикли, които да се прескочат.
И накрая:
goto е оператор от най-ниско ниво. А ние отдавна сме се отказали от операторите от ниско ниво с въвеждането езиците от високо ниво и компилаторите им с цел по-лесното писане и четене на кода от човеци.
Дали да го забраним - в никакъв случай! Има ситуации, в които goto e незаменим, или би довел до неимоверни подобрения в скорост или памет. Но тези ситуации въобще не са често срещани в ежедневието на средностатистическия програмист!
Затова нека се отнесем с него като спасителна буут дискета: нека си го имаме, нека знаем как и в кои случаи да го използваме, но да си седи в ъгълчето със старите дискети и да се молим никога да не ни се налага да го използваме!
За жалост доста от преподавателите ни, или не им са ясни, или не са се замисляли, или въобще не им се обяснява за принципите на програмирането, в частност goto, и им е много по-лесно да кажат "Забранявам goto със закон", отколкото да се аргументират защо така!
Ей, много емоционално го вкарах накрая, пълно с удивителни!!!