Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > оператор перехода goto |
Автор: UniBomb 14.12.2006, 21:02 |
Никогда не использовал и запрет преподавателей на использование оператора воспринимал как должное. Но всё таки интересно, почему не рекомендуется использовать goto в программах? Это чисто эстетические причины или же некорректность в работе оператора? |
Автор: JackYF 14.12.2006, 21:05 |
Это не только эстетические причины. Вообще на эту тема уже столько раз поднималась... воспользуйся поиском. goto нарушает естественное течение программы, т.е. невызов нужных конструкторов/деструкторов, запутанность программ... Минусов очень много. Средства языка позволяет свободно обходиться без goto. Однозначно false... |
Автор: INHazeR 14.12.2006, 21:07 |
Whenever possible, you should avoid using gotos in your program. They tend to encourage very convoluted code that can be extremely difficult to follow. As the goto is theoretically unnecessary - there's always an alternative approach to using goto - a significant cadre of programmers say you should never use it. I don't subscribe to such an extreme view. It is a legal statement after all, and there are occasions when it can be convenient. However, I do recommend that you only use it where you can see an obvious advantage over other options that are available. |
Автор: MAKCim 14.12.2006, 21:08 |
чушь, что его нельзя использовать главное использовать с умом и когда это действительно облегчает понимание кода в С++, скорее всего, можно обойтись в большинстве случаев без него, в С много моментов, где его применение оправдано Если есть желание, посмотри исходники http://www.linux-m32r.org/lxr/http/source/ - яркий пример любви к goto ![]() Добавлено @ 21:10 JackYF, не согласен с тобой, нельзя быть таким категоричным goto во многих случаях делает код как раз менее запутанным и понятным |
Автор: UniBomb 14.12.2006, 21:11 | ||
JackYF, Поиском воспользовался, но не нашёл темы с аналогичным названием. Возможно эта тема и раскрывалась в топике с другим вопросом, но перелопачивать из все не представляется приятным занятием...
А вот если оператор используется в линейном коде, где нет ни конструкторо/деструкторов и скажем идёт расчёт какой-нибудь системы уравнений, где нельзя однозначно предугадать дальнейшее решение и в этом коде будет проще использовать этот оператор (ну скажем короче, продуктивнее и проще, чем куча ифоф, кейсов, форов и вайлов). В таких случаях тоже низя? INHazeR ну вот, сидеть мне теперь со словарём допозна... Единственное что я понял, что оператор теоретически безопасен (?). MAKCim ![]() |
Автор: apook 14.12.2006, 21:13 |
Короче на сколько я понимаю этот оператор приводит к ошибкам программы особенно если код большой а так же если кто-то захочет разобрать твою прогу (дизассембл) то участок кода напр: for( ;; ) { .... for( ;; ) { if( x <4 ) goto ass; } } Вроде-бы сведет на нет его понимание но я иногда не брезгую хотя не очень он мне тоже нравится |
Автор: MAKCim 14.12.2006, 21:14 | ||
если код станет понятнее - однозначно можно goto, повторюсь, это не табу |
Автор: TaNK 14.12.2006, 21:15 |
goto необходимо использовать при самой необходимости, например когда невозможно использовать оператор break; |
Автор: JackYF 14.12.2006, 21:15 |
Unexpected returnvalue 2 from Glimpse - вот ответ на поиск 'goto' в тексте(ссылка Makcim'a). ))) Очень опасно. Особенно в С++. Я лично на С ничего не пишу и не собираюсь. |
Автор: MAKCim 14.12.2006, 21:15 |
UniBomb, пример чего? |
Автор: UniBomb 14.12.2006, 21:16 | ||
apook,
Допустим исходники только для твоих глаз, причём очень хорошо закоментирована. |
Автор: INHazeR 14.12.2006, 21:17 |
если оператор в языке существует, значит использовать его можно и нужно, если того требует ситуация. другое дело, что я даже гипотетически не могу представить себе ситуацию, когда этот оператор был бы незаменим. гораздо проще и надежнее использовать условия и циклы. ИМХО. |
Автор: UniBomb 14.12.2006, 21:18 |
MAKCim, Ну... да нет, просто думал есть где-нить под рукой кусок кода, где он действительно оправдан... |
Автор: MAKCim 14.12.2006, 21:18 | ||||||
Вообще, С++, если разобраться, очень опасный язык Мое имхо, все, что к месту - хорошо, goto в том числе ничего плохого в нем нет Добавлено @ 21:24
просто пример из ядра, не скажу, однако, что тут без goto не обойтись |
Автор: JackYF 14.12.2006, 21:25 |
Вообщем, я уже 3 года обхожусь без goto. По сему считаю, что его нужно применять только в случае крайней необходимости. К пример, выход из двойного и даже тройного цикла не считаю такой крайней необходимостью. Это лично мое мнение, никому навязывать не собираюсь. |
Автор: Gen 14.12.2006, 21:27 |
Вопрос - а много ли он сжирает ресурсов по сравнению с готозаменяющими циклами?? ![]() |
Автор: INHazeR 14.12.2006, 21:31 |
гм. как goto может сжирать ресурсы? это же команда |
Автор: codelord 14.12.2006, 21:32 | ||
в книге K&R об этом уже давно написали. коротко: ничего криминального, не обязательно, всегда можно обойтись. сам давно уже не пользовался. Хотя когда еще в школе на бейсике то всегда фрагмент K&R
|
Автор: Gen 14.12.2006, 21:38 | ||
Сформулирую вопрос по другому - целесообразно ли использовать его постоянные вызовы в цикле, если, например, это делает код более читаемым?? |
Автор: Dray 14.12.2006, 21:41 |
Ну раз так, почему нет? Если побочных эффектов не вылезет, - используй. |
Автор: witex 14.12.2006, 21:44 |
goto ваабще смысла нету использовать. Использование функций всегда заменяет goto. Тем более что использоване функций, делает значимо читабильным код, чем с goto |
Автор: MAKCim 14.12.2006, 21:46 | ||
call != jmp |
Автор: witex 14.12.2006, 21:49 |
понятно дело, что так и есть! Но я встречал столько кадров которые пытались заменить функции оператором goto |
Автор: MAKCim 14.12.2006, 21:52 | ||||
к чему тогда
|
Автор: GrayCardinal 14.12.2006, 21:53 |
UniBomb, ИМХО Оператор "goto" нельзя использовать по той же самой причине по какой в Советском Союзе нельзя было ездить на одном рельсе. /ИМХО |
Автор: nikitao 14.12.2006, 22:02 |
Про goto - это боян , который появился пожалуй сразу с появлением языков высокого уровня. О нем спорили и спорить будут ![]() ![]() Если вкратце , то моя позиция такая ( хотя я goto не юзал года 3 уже) : Если на тебе резиновые сапоги, то зачем обходить три квартала, чтобы не промочить ноги? ЗЫ Когда создавался ЯП Ада ( признаный самым продуманным ЯП ) , то шли долгие дискуссии на эту тематику и в результате goto все же было включить в него ![]() Добавлено @ 22:03 GrayCardinal, слишком громкое заявление. имхо. С другой стороны я пожалуй соглашусь с Void , который говорил , что goto при правильном проектировании просто не нужен. Отсутствие goto должно стать для программиста не целью , а результатом накопления им опыта ) |
Автор: GrayCardinal 14.12.2006, 22:13 |
nikitao, Так ясно что ИМХО, или дописать ? ![]() |
Автор: nikitao 14.12.2006, 22:25 |
Извени , не уверен , что вопрос понял ![]() ![]() |
Автор: GrayCardinal 14.12.2006, 22:52 |
nikitao, Так нормалек ? Добавлено @ 23:00 ЗЫ А будем обсуждать можно ли использовать обе ? ![]() ![]() ![]() |
Автор: UniBomb 14.12.2006, 23:05 | ||
nikitao,
Ты опять таки возвращаешся к вопросу об эстетики, имхо программиста меньше всего должно беспокоить наличие оператора (если это конечно не приводит к ошибке) goto. Прочтя все высказывания я понял одно - программиста от "кулхацкера" отличает как раз ниличие или отсутвие goto в коде их программ. С этой же точки зрения можно забанить функцию ReadFileEx, когда есть такая замечательная функция ReadFile (это просто пример, взял первые попавшие на ум похожие функции). А то что такие программы трудно читать - это проблемы того, кто читает (хотя я всё таки за "правила хорошего тона" и стараюсь писать удобочитаемый код). Моё ИМХО - если оператор или функция не вызывает ошибки, то её нужно использовать эти операторы или функции в случае максимального комфорта... Gen, Dray, к слову - а что значат картинки у вас в подписях? |
Автор: apook 14.12.2006, 23:17 |
Вот статья как Умные дядьки изгнали GOTO из одного языка |
Автор: nikitao 15.12.2006, 00:00 | ||
Жесть.. ![]() GrayCardinal, ![]() |
Автор: UniBomb 15.12.2006, 00:07 |
nikitao, Спасение утопающик - дело рук самих утопающих (или как то так...). Программа может быть написана грамотно и умно, но и без goto нечитабельна... И вообще, читай предложение целиком и не придирайся к отдельной фразе... |
Автор: UniBomb 15.12.2006, 11:54 | ||
Rockie,
Опять таки всё зависит от точки зрения. Но сабж пошёл не в то русло, поэтому, прекращая флуд, последнее слово пусть остаётся за тобой. |
Автор: Любитель 15.12.2006, 11:56 |
В C даже сомнения нету. Если не извращаться, а осмысленно использовать, то это нормальный и естественный оператор, который не только усложняет восприятие кода, но и упрощает его. В плюсах - лучше воздержаться. Есть множество альтернатив, а goto в плюсах всё же не безопасен. |
Автор: UnrealMan 15.12.2006, 13:00 | ||
А поподробней можно? |
Автор: maxim1000 15.12.2006, 13:13 |
касательно невызывания конструкторов/деструкторов при использовании goto это не свсем так: если с помощью goto происходит выход из области видимости объекта, его деструктор вызывается в то же время не допускается использование goto, которое приводит к пропуску конструкторов P.S. не то, чтобы я за него агитировал, но и лишнего ему приписывать не надо ![]() |
Автор: JackYF 15.12.2006, 16:23 | ||
Наверное, ты прав. |
Автор: SaDFromSpb 15.12.2006, 23:07 |
Что касается меня, то с тех пор, как препод нам давным давно сказал, что goto - это от дьявола, и что использующий его да будет гореть в геене огненной, так ни разу им и не воспользовался. Считаю, что код можно сделать красивым и удобочитаемым без оператора goto, уж по крайней мере в С++. По поводу ядра линукс: его пишут особые люди с особым складом программистского ума =). Если начинать прогать с asm'а =), то отказ от оператора goto сперва покажется чем-то диким, наверное. (Хотя кто в наши времена начинает с asm'а? =) ) Эта тема, действительно, может превратиться в долгий флуд, и я не стал бы сюда постить, если бы не вспомнил про одну интересную статейку, в которой представляется чудесный способ избавления от трудных мест в алгоритме со многочисленными ветвлениями и "внезапными" выходами по среди тел воложенных циклов. http://www.codenet.ru/progr/alg/algoritm.php Эта статья, я думаю, будет особо полезна тем, кто считает, что в некоторых случаях goto - панацея. П.С.: Прошу заметить, что ярым противником goto не являюсь. Хотя был бы неприятно удивлен увидеть его в коде матерого прикладного приложения, написанного на оо языке. Когда он действительно вреден, так это когда его используют начинающие, вместо того, чтобы лучше продумать заковыристый кусок алгоритма. |
Автор: UnrealMan 16.12.2006, 11:20 | ||||||||||
Не наверное, а точно:
Пропуску любой инициализации вообще:
Вот-вот. |
Автор: FelikZ 16.12.2006, 16:58 |
По-моему в малом количестве в некоторых специфических задачах вполне можно употреблять без всяких сомнений... |
Автор: zabivator 16.12.2006, 17:08 |
Читал тему, с кем-то согласен, с кем-то не очень. Один момент! Вот представьте себе, что идет обход дерева через рекурсивный вызов метода...допустим, для поиска определенного элемента. Использование goto либо кидание исключения мне кажется куда более гуманным, чем традиционные методы. |
Автор: vinter 17.12.2006, 00:32 |
по мне так goto - зло для человека, который читает чужой(большой) код, особенно если goto кидает куда-нить за пределы видимой страницы.. натерпелся с этими метками в асме, в С\С++ ни разу не использовал(надеюсь и не буду) и живу нормально..![]() P.S народ че случилось с аватарами некоторых участников, я народ путаю.. ![]() |
Автор: bel_nikita 17.12.2006, 02:22 | ||
считаю наоборот ![]() ![]() З.Ы.: Если профессор на лекциях говорит студентам, что goto - от дьявола, правду говорит, дабы уберечь молодой организм от злоупотребления и заставить задуматься над проектированием. Но потом, через пару лет, при определенных обстоятельствах, вы вспомните о всемогущем goto и все же используете его... но это уже будет не зеленый студент, а зрелый программист ![]() |
Автор: AlexPro 17.12.2006, 13:26 | ||
Хотел тоже высказаться, но после K&R остается только дабавить : Аминь!![]() Хотя не знаю, 10-15 лет назад - это можно еще относить к нашим временам? ![]()
В этом плане у меня довольно интересный опыт: после ассемблера я перешел на FoxPro. В виду полного отсутствия операторов перехода, мне пришлось поневоле от них отказаться. После ассемблера с его десятками операторов перехода, отсутствие их в Фоксе поначалу приводило в ступор. Так что имеется опыт как интенсивого использования операторов перехода, так и полного отказа от них. В проекте, над которым я сейчас работаю (20К строк) оператор goto используется ровно пять раз. Каждое его использование обусловлено соображениями производительности и (или) читаемости кода (т.е. использование оператора приводило к упрощению кода). Везде операторы и метки перехода находятся в пределах одного экрана. Что, собственно, я этим хотел сказать? Да ровно то, что уже сказали Керниган и Ричи: оператор можно использовать, но если это действительно нужно. |
Автор: Kirill89 17.12.2006, 17:17 |
Я может быть немного не по теме, но как например в visual basic без goto обойтись? например on error goto <метка>. |
Автор: Anikmar 17.12.2006, 23:41 |
А при чем здесь форум С++ ? |
Автор: Kirill89 18.12.2006, 00:07 |
я и говорю, немного не по теме. просто это можно сказать довод в пользу goto, ведь речь шла об операторе, а не языке... |
Автор: UniBomb 18.12.2006, 13:31 |
bel_nikita, Вот это действительно аминь... Anikmar, Kirill89, Вероятно автор топика имел в виду использование оператора в программах c/cpp. Хотя кто его знает ![]() |
Автор: Voldemar2004 18.12.2006, 13:38 | ||||||
![]() А в VB
|
Автор: Anikmar 18.12.2006, 14:09 | ||
И наоборот. С goto иногда получается красивее и быстрее. Блин, я тоже в этот баян втянулся... ![]() Я в своем проекте использую goto целых 3 раза и не собираюсь ничего выдумывать, чтобы его от туда вымарать - он там логично сидит, никому не мешает, ничего не нарушает, а городить хренову тучу отступов и скобок не вижу смысла. Тем более использовать throw... Нормальный оператор. Расширяет возможности языка. Все лежит на совести программера. Как говорится с дури и х... сломать можно. |
Автор: UniBomb 19.12.2006, 00:12 |
Anikmar, Вот! Вот оно!! Всё таки есть те, кто считает нормальным использовать оператор и те, кто считает это злом... кстати, отсюда следует правило - хороший баян заразителен ![]() |
Автор: SergeCpp 20.12.2007, 14:54 |
Пожалуй, будет интересен некий исторический экскурс в тему Вот с такой вот стороны ![]() ![]() И вот с такой вот http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdf ![]() |
Автор: Lazin 20.12.2007, 15:01 |
я использовал goto всего 2 раза в жизни: 1 раз в программе на С, там это к месту было... 2 раз в программе на паскале, курсе эдак на первом)) Добавлено через 1 минуту и 27 секунд вообще считаю что можно, но не больше одного goto на ф-ю, иначе код читать станет невозможно... |
Автор: SaDFromSpb 20.12.2007, 15:18 | ||
Если ты обходишь дерево для поиска элемента, то его нахождение должно быть как раз естественным завершением всей рекурсии... В Java вообще оператора goto нет. (Хотя слово goto зарезервировано - использовать его нельзя). Посправшивайте в ветке о Java на сколько сильно они от этого страдают ![]() ЗЫ. Ну нифига вы бородатую тему подняли из праха =) |
Автор: zkv 20.12.2007, 15:20 | ||||
может не более одного label'a?
|
Автор: Lazin 20.12.2007, 15:40 | ||
ага так как логику работы этого
уже не переварить |
Автор: Cycle 21.12.2007, 00:17 |
А исключения это уже сложно? Люди стараются придумывают замену goto для вас, а вы... ![]() |
Автор: MAKCim 21.12.2007, 00:31 |
goto - вещь полезная и во многих случаях оправдана очень полезна в управлении ресурсами в структурных языках типа С здесь возможна замена goto функциями, но код будет менее эффективен и логичен долой предрассудки! ![]() Добавлено через 1 минуту и 6 секунд не всегда оправдано исключения - крайне тяжеловесный механизм для прикладной логики самое то, но для критичных участков не подойдет |
Автор: sgrey 21.12.2007, 06:15 |
если goto не нарушает естественного хода программы (т.е. нет скачков вверх кода) то вполне можно его использовать, конечно же с умом и не пихать везде где можно... особенно учитывая что практически в любом случае можно обойтись и без него... |
Автор: xvr 21.12.2007, 16:05 | ||||
Вообще то не рекомендуется, ну например так:
Файл insn-recog.c из gcc |
Автор: Mayk 21.12.2007, 16:11 |
Это сгенерированный код. В сгенерированном коде читабельность занимает последнее место. имхо. |
Автор: xvr 21.12.2007, 18:30 | ||
Проблема в том, что иногда ТАК пишут и руками - вот для таких 'умельцев' и запрещают пользоваться goto. Нормальный вменяемый программист пользуется goto только там, где это действительно надо (т.е. почти нигде ![]() |
Автор: MAKCim 21.12.2007, 23:42 | ||
на ядро Linux посмотрите по вашим словам получается, что его шизофреники пишут ![]() еще раз говорю, долой предрассудки если уж на то пошло, то нет таких ситуаций, где "это действительно надо" все можно переписать без goto но с goto очень часто понятнее, быстрее и логичнее |
Автор: SaDFromSpb 22.12.2007, 07:21 | ||||
Не только поэтому. Исключения - это только для исключительных ситуаций. Уж лучше использовать goto, вместо того чтобы использовать исключения, как элемент логики программы при ее нормальной работе. |
Автор: MAKCim 22.12.2007, 10:43 | ||
goto в подавляющем большинстве случаев используется именно как средство управления ресурсами в исключительных ситуациях я, честно говоря, не видел, чтобы где-нибудь исключения использовались не для исключительных ситуаций ![]() |
Автор: Lazin 24.12.2007, 08:54 | ||
я у страуса видел ![]() имхо в большинстве случаев можно переписать код без гоуту и при этом в читабельность только вырастет... Хотя иногда без этого нельзя. У меня оператор goto появлялся только в очень больших функциях(неправильно спроектированных) ![]() |
Автор: bsa 24.12.2007, 12:38 |
Lazin, а у меня оператор goto появляется только там, где я это запроектировал. В частности, в функции с таблицей переходов (расширение gcc - позволяет преобразование void* к метке и обратно). |
Автор: GrayCardinal 24.12.2007, 14:16 |
Народ, имейте совесть, что значит "нельзя использовать" оператор, который есть по стандарту в языке ? Не хочешь - не используй. Всё. |
Автор: Albanec 30.12.2007, 17:34 |
По мне дак оператор готу ето как одна из возможностей реализовать свою идею, и я скажу противникакм данного оператора что не стоит брызгая слюной арать что применение данного оператора не есть хорошо и что его применение приведет всех в ад))) По моему ето бред, После создания нескольких програм на ассемблере, я понимаю что кроме оператора goto нету ни одного оператора который бы его заменил(в смысле на низком уровне прогрммирования), так что все операторы похожи на goto(просто в машином языке(ассемблер)нету других операторов), приведите мне хоть один низкоуровневый оператор типа if() я вам памятник поставлю)). И скажите мне зачем его вводят во всех языках программирования если он "НЕ НУЖЕН ИЛИ БЕЗ НЕГО МОЖНО ОБОЙТИСЬ"???? А на сечёт читаемости кода, полностью согласен читается трудно, но после некоторого опыта программирования на ассемблере ето детские сказки)) Вообщем моё мнеие такое если использовать данный оператор то только если: без него не обоитись, или он улутшит читаемость кода. Но не в коем случае нельзя ставить крест на даном операторе)) надо его использовать с умом)) |
Автор: SaDFromSpb 30.12.2007, 18:10 |
??!! Хде? Ссылку в студию! |
Автор: nerezus 30.12.2007, 19:02 | ||||
P.S. иног да бывает нужен. например при кодировании математического алгоритма, где описание основано на шагах с очень сложной связью. |
Автор: Mayk 1.1.2008, 09:38 | ||||
В яве реализован выход из вложенных циклов. goto там уже нет. не помню чтоб кому то из за этого приходилось страдать.
![]() |
Автор: MAKCim 1.1.2008, 10:53 | ||
Mayk, логика, которую можно описать табличными переходами внутри функции
компилятор GCC |
Автор: nerezus 1.1.2008, 19:31 | ||
|
Автор: SaDFromSpb 22.1.2008, 14:08 | ||
Хы хы. У нас реализован алгоритм Хука-Дживса. Гоуту не используется. Хотя я еще уточню у автора, когда он подойдет. |
Автор: nerezus 22.1.2008, 14:12 |
У меня он тоже без goto. Просто читаемость ухудшается ) |