Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Оператор GOTO  (Прочитано 24132 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« : 04-10-2006 05:44 » 

Почему так часто приходиться слышать мнение, что оператор goto в С/С++ использовать "нехорошо" и всегда можно обойтись без него?
Не уже ли он так плох или все же есть места где он может оказаться полезен?
Записан
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 04-10-2006 06:04 » 

Как нам объясняли, данный оператор делает код программы менее читабельным это раз. И еще я cлышал, что недостаток оператора goto заключается в том, что конвеер процессора в результате работы оператора goto оказывется бесполезным, что сказываеся на скорости исполнения. Но по поводу последнего что-то мучают сомнения.
Записан

ещё один вопрос ...
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 04-10-2006 06:51 » 

Сказать умными словами или на пальцах показать?

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

Вывод - по обстоятельствам

А вот насчет скорости выполнения - посмотри как компилятор превратит if () then () else ()
или case 


Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 04-10-2006 07:08 » 

goto преходиться применять действительно крайне редко. И то когда код пишется на чистом C. А в C++ не разу небыло такой ситуации чтобы была необходимость в goto.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 04-10-2006 07:14 » 

nikedeforest, потери производительности идут при неправильно предсказанном условном переходе. Оператор goto кодируется как безусловный переход и на скорости практически не сказывается. А вот условные операторы и циклы преобразуются в условные переходы. Вреднее всего условные операторы "if" и "? :", т.к. теоретически могут каждый раз приводить к перезагрузке конвеера. Конечно, все это не повод отказываться от них, т.к. логика программ строится именно на условиях.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 04-10-2006 07:18 » 

Понятно, спасибо.
Записан

ещё один вопрос ...
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 04-10-2006 07:20 » 

Кстати, дискуссия на эту тему была не далее чем года полтора назад. Там было высказано много точек зрения и практических приемов. Рекомендую поискать.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 04-10-2006 07:21 » 

если честно, когда встретил для себя красивейший язык C++ , (забыл про васик, как про страшный сон ))) ), то не поверите, ни разу не пользовался goto . Причём не из принципа никакого, а просто ни разу не понадобилось Улыбаюсь Вот до этого момента, до появления этой вот темы, даже не вспоминал про этот оператор...

а перейти в конец всех жутких циклов можно при помощи

try{}
catch(...){}
Записан

Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 04-10-2006 07:34 » 

Вот и я о том же Алексей1153. В C++ связка try, throw, catch решает все проблемы. А в C иногда бывает (правда крайне редко), что без goto не обойтись.
Да и не такой уж он и страшный как его представляют. И код нормально читать если использовать goto по уму.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #9 : 04-10-2006 14:03 » 

Serg79, Я как-то встретил Олимпиадную задачку. Там нужно было перевести кусок кода строк на 20, весь испрешенный goto. В программу без этого оператора вообше. Я просидел минут 15, так и не врубился в логику. После этого плюнул и не стал решать.
За всю практику писания на С и С++ я не разу не применил goto. Всегда можно найти прием обхода онного и кстати код будет компактнее.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 05-10-2006 04:28 » new

Все таки нашелся человек который полностью не приемлит goto, а то я уже стал думать что таких нет.  Да-да
Честно говоря, можно и без goto такого наваратить, что и сам черт потом ногу сломит.

Простой пример:
void foo(void)
{
    /* Запросить что-то */
    ...
    for( ; ; )
    {
        switch( get_msg() )
        {
            case MSG_READ:
                ...
                break;
            ...
            ...
            ...
            case MSG_EXIT:
                goto _EXIT;
        }
     }
_EXIT:
    /* Вернуть запрошенное */
    ...
}


Если меня спросят: Можно здесь обойтись без goto?
Да, конечно можно. Но зачем, когда он позваляет нормально выполнить ту задачу которая требуется.
А если кто-то скажет, что данный код стал хуже читаться из за этого, значит он и любой код будет в не состоянии прочитать.
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #11 : 05-10-2006 05:52 » 

Serg79, я бы заменил на do {} while()
а такой for можно и на goto из конца в начало заменить
интересно из нутри switch можно сделать break; для внешнего цикла?
Записан

Странно всё это....
ysv_
Помогающий

ua
Offline Offline

« Ответ #12 : 05-10-2006 12:19 » 

Цитата
интересно изнутри switch можно сделать break; для внешнего цикла?
Нет
Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 06-10-2006 05:28 » 

Serg79, я бы заменил на do {} while()
а такой for можно и на goto из конца в начало заменить
Не понял  Здесь была моя ладья... , это как?
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #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
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 06-10-2006 06:23 » 

Понятно Улыбаюсь
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #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
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #17 : 06-10-2006 07:39 » 

LogRus вот видишь, всегда приходиться вводить дополнительную переменную, которая будет сигнализировать об завершении цикла. А иногда ох как не хочется это делать.  Не-а...

Хотя для Win32 это и не кретично.
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #18 : 06-10-2006 07:54 » 

я думаю оптимизатор выкинет переменную нафик. Ага
надо буде на досуге проверить(в ассемблерный код глянуть).
Записан

Странно всё это....
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines