Важная информация
Показано с 1 по 10 из 10

Тема: Имитация goto

  1. #1 Имитация goto 
    Разбирающийся
    Регистрация
    06.09.2012
    Адрес
    MPLS/MN USA
    Сообщений
    31
    Сказал(а) спасибо
    0
    Поблагодарили 1 раз в 1 сообщении
    Записей в блоге
    1
    Есть один забавный и простой способ "имитации" оператора goto, так не любимого СиПиПишнечками:

    Код :
    enum kuda_prigaem_e { PRIG_LABEL1, PRIG_LABEL2, PRIG_LABEL3, PRIG_LABEL4 };
     
    int kuda_prigaem = PRIG_LABEL1;
     
    while(1)
    {
        switch(kuda_prigaem)
        {
             PRIG_LABEL1: 
             doSomething1();
             kuda_prigaem=PRIG_LABEL3;   // устанавливаем переменную-ссылку на следующую отметку )
             break;
     
             PRIG_LABEL2: 
             doSomething2();
             break;
     
             PRIG_LABEL3:
             doSomething3(); 
             break;
     
             PRIG_LABEL4: 
             doSomething4();
             break;
     
     
        }
    }
    Ответить с цитированием  
     

  2. #2  
    Разбирающийся Аватар для seisros
    Регистрация
    12.09.2012
    Сообщений
    29
    Сказал(а) спасибо
    0
    Поблагодарили 0 раз(а) в 0 сообщениях
    И чё? В чём смысл темы?
    Ответить с цитированием  
     

  3. #3  
    Профи Аватар для Dimon012
    Регистрация
    09.02.2011
    Адрес
    Владивосток
    Сообщений
    850
    Сказал(а) спасибо
    29
    Поблагодарили 130 раз(а) в 108 сообщениях
    Записей в блоге
    3
    Смысл нелюбви у оператору GOTO в том, что он реально затрудняет чтение программы (уж поверьте мне на слово) и при этом, без него можно совершенно безболезненно обойтись.
    Сам по себе этот оператор попал в языки высокого уровня как калька из языков низкого уровня, ассемблеров, или вообще машинных кодов.
    И все же, если Вы уверены, что программа будет не более 10-20 строк, можете применять его, если хотите сделать что либо более осмысленное, то будте любезны пользоваться блочными операторами!
    Ответить с цитированием  
     

  4. #4  
    Разбирающийся
    Регистрация
    06.09.2012
    Адрес
    MPLS/MN USA
    Сообщений
    31
    Сказал(а) спасибо
    0
    Поблагодарили 1 раз в 1 сообщении
    Записей в блоге
    1
    Dimon012, смысл нелюбви к оператору goto - очень великая вероятность запутать компилятор С++... а как следствие куча потерянных ячеек памяти, кривые указатели и переполненный стек... Если в Си ещё как-то это можно проверить, то для С++ это просто задница полная...
    поэтому, и только поэтому не рекомендуют использовать оператор goto в C++... а в целом, в гибридном коде часто вижу операторы goto.
    ничего плохого в них нет. Более того, есть ситуации в которых без него почти не выкрутиться... ( например, сознательная обфускация кода )
    Ответить с цитированием  
     

  5. #5  
    Разбирающийся
    Регистрация
    06.09.2012
    Адрес
    MPLS/MN USA
    Сообщений
    31
    Сказал(а) спасибо
    0
    Поблагодарили 1 раз в 1 сообщении
    Записей в блоге
    1
    Цитата Сообщение от seisros Посмотреть сообщение
    И чё? В чём смысл темы?
    Смысл темы в предоставлении информации и/или обсуждении её.
    Не все темы на форумах носят только вопросительный характер.
    Ответить с цитированием  
     

  6. #6  
    Профи Аватар для Dimon012
    Регистрация
    09.02.2011
    Адрес
    Владивосток
    Сообщений
    850
    Сказал(а) спасибо
    29
    Поблагодарили 130 раз(а) в 108 сообщениях
    Записей в блоге
    3
    Цитата Сообщение от handrix Посмотреть сообщение
    Dimon012, смысл нелюбви к оператору goto - очень великая вероятность запутать компилятор С++... а как следствие куча потерянных ячеек памяти, кривые указатели и переполненный стек... Если в Си ещё как-то это можно проверить, то для С++ это просто задница полная...
    поэтому, и только поэтому не рекомендуют использовать оператор goto в C++... а в целом, в гибридном коде часто вижу операторы goto.
    ничего плохого в них нет. Более того, есть ситуации в которых без него почти не выкрутиться... ( например, сознательная обфускация кода )
    Хорошо! Предположим Вы меня убедили, в том что касается С++, но в остальных языках получается это не страшно! Тогда почему в фортране в котором изначально был только goto, и с этим все свыклись, в итоге ввели блочные (структурные) операторы? Стандарт Фортран77 то постарше С++ будет, не говоря уже о С#.
    Ответить с цитированием  
     

  7. #7  
    Разбирающийся
    Регистрация
    06.09.2012
    Адрес
    MPLS/MN USA
    Сообщений
    31
    Сказал(а) спасибо
    0
    Поблагодарили 1 раз в 1 сообщении
    Записей в блоге
    1
    Цитата Сообщение от Dimon012 Посмотреть сообщение
    Хорошо! Предположим Вы меня убедили, в том что касается С++, но в остальных языках получается это не страшно! Тогда почему в фортране в котором изначально был только goto, и с этим все свыклись, в итоге ввели блочные (структурные) операторы? Стандарт Фортран77 то постарше С++ будет, не говоря уже о С#.
    Я не говорил о других языках. При старте топика речь изначально шла о С++. Что касается других языков - вы не совсем правы. В большинстве не ООП языков операторы безусловных переходов, в том числе и goto можно использовать абсолютно безболезненно, при условии соблюдения логичности и обоснованности. А уж использовать их или более "перспективный" блочный метод - это уже глубоко личное дело каждого отдельно взятого "программиста". Лично я почти не использую оператор goto но не из-за того, что это страшно или наказуемо. И хотя я в основном практикую стандарт С99 в частности в виде lcc и tcc мне ещё не приходилось писать программы настолько большие чтобы был оправдан риск явного использования безусловного перехода. Но если бы вы сели за дизасемблер и хотя бы чуть чуть поковыряли свежескомпилированный бинарник то достаточно быстро бы заметили, что этот код кишит безусловными переходами. Так что НЕ использование оператора goto обусловлено одним лишь только человеческим фактором. Большинство программистов просто не могут уследить за ними ).
    Ответить с цитированием  
     

  8. #8  
    Новичок
    Регистрация
    16.01.2013
    Сообщений
    2
    Сказал(а) спасибо
    0
    Поблагодарили 1 раз в 1 сообщении
    switch -- вообще интересная конструкция, так как выполнение проходит через все метки после совпадения, с помощью него можно много нестандартных штук реализовтаь -- например, чего стоит метод Даффа
    Ответить с цитированием  
     

  9. #9  
    Гуру Аватар для Konstantin Shcherba
    Регистрация
    08.11.2010
    Сообщений
    1,336
    Сказал(а) спасибо
    26
    Поблагодарили 139 раз(а) в 107 сообщениях
    Записей в блоге
    1
    Цитата Сообщение от iloveYou Посмотреть сообщение
    с помощью него можно много нестандартных штук реализовтаь
    Ну так поделитесь с народом.
    Ответить с цитированием  
     

  10. #10  
    Профи Аватар для Dimon012
    Регистрация
    09.02.2011
    Адрес
    Владивосток
    Сообщений
    850
    Сказал(а) спасибо
    29
    Поблагодарили 130 раз(а) в 108 сообщениях
    Записей в блоге
    3
    Цитата Сообщение от handrix Посмотреть сообщение
    Но если бы вы сели за дизасемблер и хотя бы чуть чуть поковыряли свежескомпилированный бинарник то достаточно быстро бы заметили, что этот код кишит безусловными переходами. Так что НЕ использование оператора goto обусловлено одним лишь только человеческим фактором. Большинство программистов просто не могут уследить за ними ).
    Абсолютно согласен, если программу генерить автоматически, то в этом случае никакой разницы нет используется goto или нет, к тому же для языков низкого уровня goto предпочтителен, как более простая конструкция.
    И все же вспоминая свои первые программы (извините на басике) которые даже работали, но модифицировать их было совершенно невозможно и все именно из-за goto. Представьте 400-500 строк кода, куча вложенных условий, по 3-4 уровня. Переходить на использование блочных операторов, мне было психологически очень трудно.
    Ответить с цитированием  
     

Информация о теме
Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •