реклама на сайте
подробности

 
 
6 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Оператор GoTo, безусловный переход или правила хорошего тона
J_B
сообщение Sep 29 2006, 15:13
Сообщение #1


Участник
*

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



Почему считается, что "нехорошо" использовать данного оператора?
Go to the top of the page
 
+Quote Post
Yura_K
сообщение Sep 29 2006, 16:02
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 185
Регистрация: 5-05-06
Из: Ekaterinburg, Russia
Пользователь №: 16 821



Как я понимаю, этот оператор неявно присутствует в основных конструкциях структурированных языков. Цикл то не организовать без goto smile.gif. Хотя, например, в C оператор goto присутствует, просто им не рекомендуют пользоваться. Вообщем, все вопросы приходят к разговору о стиле, используемом при разработке ПО (структурированное, объектно-ориентированное программирование и т.д.).


--------------------
Чудес не бывает - бывает мало знаний и опыта!
Go to the top of the page
 
+Quote Post
J_B
сообщение Sep 29 2006, 16:22
Сообщение #3


Участник
*

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



Полностью согласен, взять ассемблер - циклов без меток и переходов не бывает. А ПОЧЕМУ в С не рекомендуют, или так сложилось, как байте восемь бит?
Go to the top of the page
 
+Quote Post
ktod
сообщение Sep 29 2006, 16:46
Сообщение #4


Участник
*

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



Это филосовский вопрос. И ответ на него будет: "В силу некоторых особенностей человеческого разума/мышления".
Пока сами не почувствуете, объяснить более подробно будет сложно.

Сообщение отредактировал ktod - Sep 29 2006, 16:49


--------------------
Ignoramus et Ignorabimus
Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 29 2006, 16:47
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Гм. Когда-то давно (больше 15 лет назад) у нас в универе был курс информатики, который включал в себя изучение языков BASIC и FORTRAN. Там без GOTO у меня как-то не получалось. Как-то совершенно естественно GOTO в структуру языка BASIC ложился. Я в общем и сейчас не профессионал в программировании. Уровень у меня скорее любительский. С языком СИ познакомился лет пять назад. Но ни разу за это время GOTO применять не приходилось и даже не возникало такой нужды. Видимо таковы особенности структуры именно этого языка программирования. ИМХО.
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Sep 29 2006, 16:47
Сообщение #6


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Я слышал, что причина в том, что не известно будет "откуда" ты пришел в эту часть программы. Ну то есть если есть метка и где то в другом коде 2 ГоТу, то если программа перепрыгнула на метку, нельзя будет сказать откуда именно
Go to the top of the page
 
+Quote Post
bodja74
сообщение Sep 29 2006, 16:56
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



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

ЗЫ Правила хорошего тона - это набитые шишки на ошибках,собственных или чужих.
Go to the top of the page
 
+Quote Post
CD_Eater
сообщение Sep 29 2006, 17:27
Сообщение #8


Частый гость
**

Группа: Новичок
Сообщений: 173
Регистрация: 3-09-04
Из: Moscow
Пользователь №: 595



Программу проще понять, если она состоит из стандартных функциональных блоков: циклов While с пред или пост-условием, циклов с фиксированным числом повтора, вызовов подпрограмм с единственной точкой выхода (а не как в Си), и т.д.

Соблюдение правил хорошего тона облегчает другим людям (да и вам самому по истечении длительного интервала времени) понять вашу программу. Других причин вроде нет.

Соответственно, разные языки с разной степенью удобства позволяют эти правила хорошего тона использовать. В некоторых (напр., BASIC), использовать эти правила очень затруднительно, равно как затруднительно понимать программу на таком языке.
Go to the top of the page
 
+Quote Post
muravei
сообщение Sep 29 2006, 17:31
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 538
Регистрация: 13-08-05
Пользователь №: 7 591



Цитата(CD_Eater @ Sep 29 2006, 21:27) *
В некоторых (напр., BASIC), использовать эти правила очень затруднительно, равно как затруднительно понимать программу на таком языке.

Время от времени пописываю на Визуал Бэйсике, но ГОУ ТО ни разу не использовал.
Go to the top of the page
 
+Quote Post
artem100
сообщение Sep 29 2006, 17:51
Сообщение #10


Участник
*

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



go to
не явно присутствует во всех языках всегда
а идет это от гулявших ошибок перекрестных при применении нескольких go to на странице текста более чем 25 строк

конструкция
команда (условие){
что-то делать
}
логически читалась легче

в 1980-ых написаны книги по стилю написания и оформления кода
в 1988-мом Borland рекомендавал в TurboC2.0 постепенно переходить с goto на конструкции for, if и do ,а while еще не был придуман, try еще даже в мечтах не было
Borland извинялся за неоптимальность компилируемого двоичного кода с конструкцией goto
Вот с тех пор рекомендация на подсознательном уровне отложилась как правило для языков высокого уровня.

Жестко вроде нигде не запрещенно
Только рекомендации и извинения за возможные глюки
а кому глюки нужны
Тут бы быстрей как-то что-то

Так что пиши как хочешь и где хочешь, а возможные глюки в самых древних из самых древних библиотек на твоей совести будут tongue.gif
пожелтевшие бумажные 700 листов Borland-овского Help-а еще где-то лежат
но копаться и и цитировать лень
могу только полку показать Im sorry sad.gif

Сообщение отредактировал artem100 - Sep 29 2006, 18:02
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 29 2006, 18:05
Сообщение #11


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата
Почему считается, что "нехорошо" использовать данного оператора?

Цитата из Бьерн Страуструп "Язык программирования С++" (типа один из разработчиков С++):

3.3.2 Оператор goto

Презираемый оператор goto все-таки есть в С++:

goto идентификатор;

идентификатор: оператор

Вообще говоря, он мало используется в языках высокого уровня, но
может быть очень полезен, если текст на С++ создается не человеком,
а автоматически, т.е. с помощью программы. Например,
операторы goto используются при создании анализатора по заданной
грамматике языка с помощью программных средств.
Кроме того, операторы goto могут пригодиться в тех случаях,
когда на первый план выходит скорость работы программы. Один из
них - когда в реальном времени происходят какие-то вычисления во
внутреннем цикле программы.
Есть немногие ситуации и в обычных программах, когда применение
goto оправдано. Одна из них - выход из вложенного цикла или
переключателя. Дело в том, что оператор break во вложенных циклах
или переключателях позволяет перейти только на один уровень выше.


Цитата(bodja74 @ Sep 29 2006, 20:56) *
Потому что оператор безусловного перехода не сохраняет адресс возврата в стеке,и если допустим
функция в Си физически выступает как подпрограмма ,переходить к ней по безусловному переходу
даже на асме крайне рискованое занятие ,так как в конце есть все шансы встретится с коммандой ret,
которая загрузит из стека адресс возврата неизвестно какого значения и прога уйдет в ступор.

Исчо критика smile.gif простите, если сможете smile.gif
В С/С++ 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 blink.gif
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 29 2006, 18:39
Сообщение #12


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(J_B @ Sep 29 2006, 19:13) *
Почему считается, что "нехорошо" использовать данного оператора?

Да, забыл добавить:
Лично я считаю применение goto крайним случаем.
Иногда для скорости, а иногда чтобы не писать странные конструкции
которые позволят избежать использования goto.
Go to the top of the page
 
+Quote Post
Леонид Иванович
сообщение Sep 29 2006, 19:09
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 318
Регистрация: 21-07-06
Из: Минск
Пользователь №: 18 986



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


--------------------
Go to the top of the page
 
+Quote Post
bodja74
сообщение Sep 29 2006, 20:32
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



Цитата(singlskv @ Sep 29 2006, 21:05) *
[Исчо критика smile.gif простите, если сможете smile.gif


Без проблем,у меня корона из головы не упадет. smile.gif

Соглашусь со всем так как в Си не силен.
Но позвольте высказать свое ИМХО. smile.gif
Какие операторы не писали и какие бы скобки не ставили,в конечном итоге все сводится к трем елементарным инструкциям переходов - условный,безусловный и переход на подпрограмму
(то есть опять же асм ,так как МК физически еще не научился понимать Си).
Тоесть как будут откомпелированы команды на Си в элементарные команды и будут ли они допущены вообще - это зависит
от интелекта компиллера Си ,а не от самого языка.

Для ПК я пишу на VB6 ,там также с помощью GOTO из функции или подпрограммы не выпрыгнеш и не запрыгнеш ,так как метки для них локальны,но это не значит что на старом и добром TB под ДОС
этого нельзя было делать.

ЗЫ Если кому хочется побольше увидеть команд Jmp под Win (тот же GOTO) - дизасемблируйте прогу,
их количество вас приятно удивит. smile.gif

ЗЫЫ Раскажите чайнику для чего нужен MFC?
Как то был интерес поизучать,зашел в книжный,как увидел габариты этого толмута,так сразу перехотелось,я на полном серьезе - этой книжицей с одного удара по голове можно убить человека.
И перехотелось не потому ,что представил ,как буду долго и нудно ее изучать,а потому что представил,если разгорится спор,как моя жонка будет гонятся с этим толмутом за мной по квартире. smile.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 29 2006, 21:57
Сообщение #15


Гуру
******

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



Цитата(bodja74 @ Sep 29 2006, 23:32) *
И перехотелось не потому ,что представил ,как буду долго и нудно ее изучать,а потому что представил,если разгорится спор,как моя жонка будет гонятся с этим толмутом за мной по квартире. smile.gif
Фигня. Задача решаема. На вопрос "что бы подарить мне на день Варенья" жена получила ответ "Трехтомник Кнута". Ничего, сижу, читаю. Жив :-) В смысле - это жена у меня спрашивала насчет подарка.

Сообщение отредактировал Сергей Борщ - Sep 29 2006, 21:58


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

6 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 16:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.01535 секунд с 7
ELECTRONIX ©2004-2016