Serg79
|
|
« : 04-10-2006 05:44 » |
|
Почему так часто приходиться слышать мнение, что оператор goto в С/С++ использовать "нехорошо" и всегда можно обойтись без него? Не уже ли он так плох или все же есть места где он может оказаться полезен?
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #1 : 04-10-2006 06:04 » |
|
Как нам объясняли, данный оператор делает код программы менее читабельным это раз. И еще я cлышал, что недостаток оператора goto заключается в том, что конвеер процессора в результате работы оператора goto оказывется бесполезным, что сказываеся на скорости исполнения. Но по поводу последнего что-то мучают сомнения.
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Sla
|
|
« Ответ #2 : 04-10-2006 06:51 » |
|
Сказать умными словами или на пальцах показать?
Когда применяю. Нарушения логики выполнения программы, например грубые неисправимые ошибки во входных данных. В таких случаях делаю переход из нескольких вложенных конструкций либо в конец программы, либо к повторению некоторой ее части. Кроме того, применение goto может привести к упрощению кода, а также к улучшению читабельности структуры программы. А вот код с обильным количеством сабжа нечитабелен ...
Вывод - по обстоятельствам
А вот насчет скорости выполнения - посмотри как компилятор превратит if () then () else () или case
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Serg79
|
|
« Ответ #3 : 04-10-2006 07:08 » |
|
goto преходиться применять действительно крайне редко. И то когда код пишется на чистом C. А в C++ не разу небыло такой ситуации чтобы была необходимость в goto.
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #4 : 04-10-2006 07:14 » |
|
nikedeforest, потери производительности идут при неправильно предсказанном условном переходе. Оператор goto кодируется как безусловный переход и на скорости практически не сказывается. А вот условные операторы и циклы преобразуются в условные переходы. Вреднее всего условные операторы "if" и "? :", т.к. теоретически могут каждый раз приводить к перезагрузке конвеера. Конечно, все это не повод отказываться от них, т.к. логика программ строится именно на условиях.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
nikedeforest
|
|
« Ответ #5 : 04-10-2006 07:18 » |
|
Понятно, спасибо.
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
RXL
|
|
« Ответ #6 : 04-10-2006 07:20 » |
|
Кстати, дискуссия на эту тему была не далее чем года полтора назад. Там было высказано много точек зрения и практических приемов. Рекомендую поискать.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #7 : 04-10-2006 07:21 » |
|
если честно, когда встретил для себя красивейший язык C++ , (забыл про васик, как про страшный сон ))) ), то не поверите, ни разу не пользовался goto . Причём не из принципа никакого, а просто ни разу не понадобилось Вот до этого момента, до появления этой вот темы, даже не вспоминал про этот оператор... а перейти в конец всех жутких циклов можно при помощи try{} catch(...){}
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #8 : 04-10-2006 07:34 » |
|
Вот и я о том же Алексей1153. В C++ связка try, throw, catch решает все проблемы. А в C иногда бывает (правда крайне редко), что без goto не обойтись. Да и не такой уж он и страшный как его представляют. И код нормально читать если использовать goto по уму.
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #9 : 04-10-2006 14:03 » |
|
Serg79, Я как-то встретил Олимпиадную задачку. Там нужно было перевести кусок кода строк на 20, весь испрешенный goto. В программу без этого оператора вообше. Я просидел минут 15, так и не врубился в логику. После этого плюнул и не стал решать. За всю практику писания на С и С++ я не разу не применил goto. Всегда можно найти прием обхода онного и кстати код будет компактнее.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Serg79
|
|
« Ответ #10 : 05-10-2006 04:28 » |
|
Все таки нашелся человек который полностью не приемлит goto, а то я уже стал думать что таких нет. Честно говоря, можно и без goto такого наваратить, что и сам черт потом ногу сломит. Простой пример: void foo(void) { /* Запросить что-то */ ... for( ; ; ) { switch( get_msg() ) { case MSG_READ: ... break; ... ... ... case MSG_EXIT: goto _EXIT; } } _EXIT: /* Вернуть запрошенное */ ... }Если меня спросят: Можно здесь обойтись без goto? Да, конечно можно. Но зачем, когда он позваляет нормально выполнить ту задачу которая требуется. А если кто-то скажет, что данный код стал хуже читаться из за этого, значит он и любой код будет в не состоянии прочитать.
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #11 : 05-10-2006 05:52 » |
|
Serg79, я бы заменил на do {} while() а такой for можно и на goto из конца в начало заменить интересно из нутри switch можно сделать break; для внешнего цикла?
|
|
|
Записан
|
Странно всё это....
|
|
|
ysv_
Помогающий
Offline
|
|
« Ответ #12 : 05-10-2006 12:19 » |
|
интересно изнутри switch можно сделать break; для внешнего цикла? Нет
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #13 : 06-10-2006 05:28 » |
|
Serg79, я бы заменил на do {} while() а такой for можно и на goto из конца в начало заменить Не понял , это как?
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #14 : 06-10-2006 06:17 » |
|
а вот так bool stop = false; do { switch( get_msg() ) { case MSG_READ: ... break; ... ... ... case MSG_EXIT: stop = true; } }while(!stop)
// а вот без цикла совсем :)
b: { switch( get_msg() ) { case MSG_READ: ... break; ... ... ... case MSG_EXIT: goto e; } goto b: } e:
|
|
|
Записан
|
Странно всё это....
|
|
|
Serg79
|
|
« Ответ #15 : 06-10-2006 06:23 » |
|
Понятно
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #16 : 06-10-2006 06:33 » |
|
а вот еще один варинт с for for(bool stop=false;!stop ; ) { switch( get_msg() ) { case MSG_READ: ... break; ... ... ... case MSG_EXIT: stop = true; } }
|
|
|
Записан
|
Странно всё это....
|
|
|
Serg79
|
|
« Ответ #17 : 06-10-2006 07:39 » |
|
LogRus вот видишь, всегда приходиться вводить дополнительную переменную, которая будет сигнализировать об завершении цикла. А иногда ох как не хочется это делать. Хотя для Win32 это и не кретично.
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #18 : 06-10-2006 07:54 » |
|
я думаю оптимизатор выкинет переменную нафик. надо буде на досуге проверить(в ассемблерный код глянуть).
|
|
|
Записан
|
Странно всё это....
|
|
|
|