|
|
  |
Оператор GoTo, безусловный переход или правила хорошего тона |
|
|
|
Sep 29 2006, 15:13
|
Участник

Группа: Новичок
Сообщений: 20
Регистрация: 17-01-06
Пользователь №: 13 275

|
Почему считается, что "нехорошо" использовать данного оператора?
|
|
|
|
|
Sep 29 2006, 16:02
|
Частый гость
 
Группа: Свой
Сообщений: 185
Регистрация: 5-05-06
Из: Ekaterinburg, Russia
Пользователь №: 16 821

|
Как я понимаю, этот оператор неявно присутствует в основных конструкциях структурированных языков. Цикл то не организовать без goto  . Хотя, например, в C оператор goto присутствует, просто им не рекомендуют пользоваться. Вообщем, все вопросы приходят к разговору о стиле, используемом при разработке ПО (структурированное, объектно-ориентированное программирование и т.д.).
--------------------
Чудес не бывает - бывает мало знаний и опыта!
|
|
|
|
|
Sep 29 2006, 16:22
|
Участник

Группа: Новичок
Сообщений: 20
Регистрация: 17-01-06
Пользователь №: 13 275

|
Полностью согласен, взять ассемблер - циклов без меток и переходов не бывает. А ПОЧЕМУ в С не рекомендуют, или так сложилось, как байте восемь бит?
|
|
|
|
|
Sep 29 2006, 16:46
|
Участник

Группа: Участник
Сообщений: 27
Регистрация: 27-09-05
Пользователь №: 8 979

|
Это филосовский вопрос. И ответ на него будет: "В силу некоторых особенностей человеческого разума/мышления". Пока сами не почувствуете, объяснить более подробно будет сложно.
Сообщение отредактировал ktod - Sep 29 2006, 16:49
--------------------
Ignoramus et Ignorabimus
|
|
|
|
|
Sep 29 2006, 17:51
|
Участник

Группа: Новичок
Сообщений: 41
Регистрация: 20-08-06
Пользователь №: 19 688

|
go to не явно присутствует во всех языках всегда а идет это от гулявших ошибок перекрестных при применении нескольких go to на странице текста более чем 25 строк конструкция команда (условие){ что-то делать } логически читалась легче в 1980-ых написаны книги по стилю написания и оформления кода в 1988-мом Borland рекомендавал в TurboC2.0 постепенно переходить с goto на конструкции for, if и do ,а while еще не был придуман, try еще даже в мечтах не было Borland извинялся за неоптимальность компилируемого двоичного кода с конструкцией goto Вот с тех пор рекомендация на подсознательном уровне отложилась как правило для языков высокого уровня. Жестко вроде нигде не запрещенно Только рекомендации и извинения за возможные глюки а кому глюки нужны Тут бы быстрей как-то что-то Так что пиши как хочешь и где хочешь, а возможные глюки в самых древних из самых древних библиотек на твоей совести будут  пожелтевшие бумажные 700 листов Borland-овского Help-а еще где-то лежат но копаться и и цитировать лень могу только полку показать Im sorry
Сообщение отредактировал artem100 - Sep 29 2006, 18:02
Эскизы прикрепленных изображений
|
|
|
|
|
Sep 29 2006, 18:05
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата Почему считается, что "нехорошо" использовать данного оператора? Цитата из Бьерн Страуструп "Язык программирования С++" (типа один из разработчиков С++): 3.3.2 Оператор goto
Презираемый оператор goto все-таки есть в С++:
goto идентификатор;
идентификатор: оператор
Вообще говоря, он мало используется в языках высокого уровня, но может быть очень полезен, если текст на С++ создается не человеком, а автоматически, т.е. с помощью программы. Например, операторы goto используются при создании анализатора по заданной грамматике языка с помощью программных средств. Кроме того, операторы goto могут пригодиться в тех случаях, когда на первый план выходит скорость работы программы. Один из них - когда в реальном времени происходят какие-то вычисления во внутреннем цикле программы. Есть немногие ситуации и в обычных программах, когда применение goto оправдано. Одна из них - выход из вложенного цикла или переключателя. Дело в том, что оператор break во вложенных циклах или переключателях позволяет перейти только на один уровень выше.Цитата(bodja74 @ Sep 29 2006, 20:56)  Потому что оператор безусловного перехода не сохраняет адресс возврата в стеке,и если допустим функция в Си физически выступает как подпрограмма ,переходить к ней по безусловному переходу даже на асме крайне рискованое занятие ,так как в конце есть все шансы встретится с коммандой ret, которая загрузит из стека адресс возврата неизвестно какого значения и прога уйдет в ступор. Исчо критика  простите, если сможете В С/С++ goto не работает за пределами функции, так что проблем со стеком и с возвратом по ret никогда не может возникнуть, единственная проблемма возникающия со стеком при использовании goto заключается в следующем: Код for (i=0;i<10;i++) { char ar[1000]; if (i==5) goto label1; } label1: память занимаемая массивом ar[1000] будет возвращена системе только после выхода за следующий блок { ... } У Microsoft специально для этих целей вместо goto используется структурная обработка ошибок (не только для этих целей): __try { ...... if(...) __leave; ...... } __finally { ...... } которая корректно умеет обрабатывать стек. НО, если Вы поизучаете код который пишет Microsoft, то например в MFC Вы обнаружите более 70 файлов в которых используется оператор goto
|
|
|
|
|
Sep 29 2006, 18:39
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(J_B @ Sep 29 2006, 19:13)  Почему считается, что "нехорошо" использовать данного оператора? Да, забыл добавить: Лично я считаю применение goto крайним случаем. Иногда для скорости, а иногда чтобы не писать странные конструкции которые позволят избежать использования goto.
|
|
|
|
|
Sep 29 2006, 20:32
|
Знающий
   
Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984

|
Цитата(singlskv @ Sep 29 2006, 21:05)  [Исчо критика  простите, если сможете  Без проблем,у меня корона из головы не упадет.  Соглашусь со всем так как в Си не силен. Но позвольте высказать свое ИМХО.  Какие операторы не писали и какие бы скобки не ставили,в конечном итоге все сводится к трем елементарным инструкциям переходов - условный,безусловный и переход на подпрограмму (то есть опять же асм ,так как МК физически еще не научился понимать Си). Тоесть как будут откомпелированы команды на Си в элементарные команды и будут ли они допущены вообще - это зависит от интелекта компиллера Си ,а не от самого языка. Для ПК я пишу на VB6 ,там также с помощью GOTO из функции или подпрограммы не выпрыгнеш и не запрыгнеш ,так как метки для них локальны,но это не значит что на старом и добром TB под ДОС этого нельзя было делать. ЗЫ Если кому хочется побольше увидеть команд Jmp под Win (тот же GOTO) - дизасемблируйте прогу, их количество вас приятно удивит.  ЗЫЫ Раскажите чайнику для чего нужен MFC? Как то был интерес поизучать,зашел в книжный,как увидел габариты этого толмута,так сразу перехотелось,я на полном серьезе - этой книжицей с одного удара по голове можно убить человека. И перехотелось не потому ,что представил ,как буду долго и нудно ее изучать,а потому что представил,если разгорится спор,как моя жонка будет гонятся с этим толмутом за мной по квартире.
|
|
|
|
|
Sep 29 2006, 21:57
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(bodja74 @ Sep 29 2006, 23:32)  И перехотелось не потому ,что представил ,как буду долго и нудно ее изучать,а потому что представил,если разгорится спор,как моя жонка будет гонятся с этим толмутом за мной по квартире.  Фигня. Задача решаема. На вопрос "что бы подарить мне на день Варенья" жена получила ответ "Трехтомник Кнута". Ничего, сижу, читаю. Жив :-) В смысле - это жена у меня спрашивала насчет подарка.
Сообщение отредактировал Сергей Борщ - Sep 29 2006, 21:58
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|