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

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

|
Почему считается, что "нехорошо" использовать данного оператора?
|
|
|
|
|
 |
Ответов
|
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, 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)
|
|
|
|
Сообщений в этой теме
J_B Оператор GoTo Sep 29 2006, 15:13 Yura_K Как я понимаю, этот оператор неявно присутствует в... Sep 29 2006, 16:02 J_B Полностью согласен, взять ассемблер - циклов без м... Sep 29 2006, 16:22 ktod Это филосовский вопрос. И ответ на него будет: ... Sep 29 2006, 16:46 rezident Гм. Когда-то давно (больше 15 лет назад) у нас в у... Sep 29 2006, 16:47 jorikdima Я слышал, что причина в том, что не известно будет... Sep 29 2006, 16:47 CD_Eater Программу проще понять, если она состоит из станда... Sep 29 2006, 17:27 muravei Цитата(CD_Eater @ Sep 29 2006, 21:27) В н... Sep 29 2006, 17:31 artem100 go to
не явно присутствует во всех языках всегда
... Sep 29 2006, 17:51 singlskv Цитата(J_B @ Sep 29 2006, 19:13) Почему с... Sep 29 2006, 18:39 Леонид Иванович Единственная ситуация, когда нужен goto, это обраб... Sep 29 2006, 19:09 _artem_ Сколько людей столько и мнений. Если не злоупотреб... Sep 29 2006, 22:40 zltigo Цитата(_artem_ @ Sep 30 2006, 01:40) Была... Sep 30 2006, 06:10  Petka Цитата(zltigo @ Sep 30 2006, 10:10) На се... Sep 30 2006, 09:43   zltigo Цитата(Petka @ Sep 30 2006, 12:43) С испо... Sep 30 2006, 10:04    Petka Цитата(zltigo @ Sep 30 2006, 14:04) Цитат... Sep 30 2006, 14:40     zltigo Цитата(Petka @ Sep 30 2006, 17:40) Аргуме... Sep 30 2006, 15:07 J_B Спасибо высказавшимся, просто написал переход от д... Sep 30 2006, 04:24 CD_Eater Цитата(zltigo @ Sep 30 2006, 14:04) Цитат... Sep 30 2006, 12:20 zltigo Цитата(CD_Eater @ Sep 30 2006, 15:20) А е... Sep 30 2006, 12:52 goodwin Совсем недавно была дискуссия на телесистемах по п... Sep 30 2006, 12:41 J_B Особо переделкой без goto не занимался, но кто что... Sep 30 2006, 14:27 zltigo Цитата(J_B @ Sep 30 2006, 17:27) Смысл та... Sep 30 2006, 14:56 xemul Цитата(J_B @ Sep 30 2006, 18:27) Особо пе... Sep 30 2006, 15:45 zltigo Код seg[0] = tmp/100;
seg[2] = tm... Sep 30 2006, 15:55 xemul Цитата(zltigo @ Sep 30 2006, 19:55) Код s... Sep 30 2006, 16:02 prottoss Выскажусь тоже про goto... так как несколько раз п... Sep 30 2006, 16:08 _artem_ Я использую goto, но это не тот случай. Не проверя... Sep 30 2006, 17:08 WHALE 2 artem_ Вы про цикл с постусловием do while слыша... Sep 30 2006, 18:40 _artem_ WHALE, во первых я не из пешеры), во вторых это не... Sep 30 2006, 19:55 WHALE for(I=0;I<=2;I++)
{
do{
TMP_P=TMP;
... Sep 30 2006, 21:25 _artem_ Да никаких извинений не нужно, не обиделся.) Я сам... Sep 30 2006, 22:17 Rst7 Господа, о чем речь? Посмотрите в исходники библио... Oct 1 2006, 06:54 bve Мне кажется, что "ноги растут" от старин... Oct 1 2006, 15:19 _artem_ Вы правы - http://en.wikipedia.org/wiki/GOTO
Но ч... Oct 1 2006, 15:39 _Bill Цитата(J_B @ Sep 29 2006, 18:13) Почему с... Oct 2 2006, 07:48 AVNN Что касается AVR и goto, то при использовании опт... Oct 2 2006, 08:22 _Bill Цитата(AVNN @ Oct 2 2006, 11:22) Что каса... Oct 2 2006, 08:35 defunct Всякий овощ полезен будучи приготовленным надлежащ... Oct 2 2006, 10:12 ValBag Во всех наставлениях по СИ для МК "...настоят... Oct 24 2007, 06:19 alexander55 Цитата(ValBag @ Oct 24 2007, 10:19)
goto... Oct 24 2007, 07:01 dxp Цитата(ValBag @ Oct 24 2007, 13:19) Во вс... Oct 24 2007, 07:19  ReAl Цитата(dxp @ Oct 24 2007, 09:19) Существу... Oct 24 2007, 11:55   SasaVitebsk Цитата(ReAl @ Oct 24 2007, 14:55) Ещё в 9... Oct 28 2007, 11:32 andron86 Цитата(ValBag @ Oct 24 2007, 08:19) Для п... Oct 24 2007, 07:23  alexander55 Цитата(andron86 @ Oct 24 2007, 11:23) Раб... Oct 24 2007, 07:58   zltigo Цитата(alexander55 @ Oct 24 2007, 10:58) ... Oct 24 2007, 08:07    alexander55 Цитата(zltigo @ Oct 24 2007, 12:07) Вот т... Oct 24 2007, 08:13   andron86 Цитата(alexander55 @ Oct 24 2007, 09:58) ... Oct 24 2007, 08:38 defunct Цитата(ValBag @ Oct 24 2007, 09:19) Для п... Oct 24 2007, 12:42 bodja74 В ассемблере вообще ни в чем ограничений нет
Пр... Oct 24 2007, 06:40 DASM Чисто в лоб типа такого
Кодwhile (1)
{
... Oct 24 2007, 06:45 IEC Ну результат почти такой же. В текущем примере из-... Oct 24 2007, 07:07 ReAl Цитата(IEC @ Oct 24 2007, 09:07) А вообще... Oct 24 2007, 11:46 zltigo Продолжаем в уже существующей ветке:
http://electr... Oct 24 2007, 07:19 ValBag Прошу прощения за создание новой темы без поиска.
... Oct 24 2007, 09:49 Maddy А собственно чего все так на бедного goto оплчилис... Oct 24 2007, 10:02 aesok GCC Bugzilla:
Only very good and very bad progra... Oct 24 2007, 10:04 alexander55 Цитата(aesok @ Oct 24 2007, 14:04) Only v... Oct 24 2007, 10:21 DASM Не отношу себя ни к вери гуд ни вери бэд, но со вр... Oct 24 2007, 10:19 DASM OFF - ReAL - а как код в трубочку свернули ? Oct 24 2007, 11:49 ValBag Перечитал всю тему. На мой взгляд отказ от примене... Oct 24 2007, 12:06 ReAl Цитата(ValBag @ Oct 24 2007, 14:06) Отред... Oct 24 2007, 12:27 ReAl Цитата(ValBag @ Oct 24 2007, 14:06) Тот ж... Oct 24 2007, 12:29 DASM А что по вашему ReAl сделал ? Oct 24 2007, 12:09 ValBag Цитата(DASM @ Oct 24 2007, 20:09) А что п... Oct 24 2007, 12:29 ReAl Раз уж я тут застрял - что я имел ввиду под ... Oct 24 2007, 12:50 ValBag ReAl ЦитатаА тут мы переводим текст с чего-то типа... Oct 24 2007, 13:09 defunct Цитата(ValBag @ Oct 24 2007, 16:09) А чем... Oct 24 2007, 13:16 ReAl Цитата(ValBag @ Oct 24 2007, 15:09) ReAl ... Oct 24 2007, 13:46  ValBag Цитата(ReAl @ Oct 24 2007, 21:46) пример ... Oct 24 2007, 14:01 ValBag defunct Понятно, появляется рябь в глазах, а затем... Oct 24 2007, 13:33 alexander55 Цитата(ValBag @ Oct 24 2007, 17:33) defun... Oct 24 2007, 13:44 ValBag REAL
Шашечек конечно не надо, но и ехать не получа... Oct 25 2007, 12:45 ReAl Цитата(ValBag @ Oct 25 2007, 14:45) Самое... Oct 25 2007, 22:04 ValBag ReAl
Теперь все понятно! Только наверное надо ... Oct 27 2007, 08:58 ReAl Цитата(ValBag @ Oct 27 2007, 10:58) Тольк... Oct 27 2007, 10:16 sensor_ua ЦитатаТут эти скобки не обязательны - согласно при... Oct 27 2007, 10:51
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|