Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> "switch" vs "if/else", выбор? 
V
    Опции темы
Rickert
Дата 25.4.2008, 09:16 (ссылка)    | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Все вот говорят, что мол нельзя юзать goto - Небезопасно это.
Но сами юзают switch. Ведь он, по сути пострен на goto принципе.
Ваше мнение и что обычно юзаете: switch/case или if/else ?


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Fazil6
Дата 25.4.2008, 09:21 (ссылка) |    (голосов:6) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



все юзаем
PM MAIL   Вверх
Rickert
Дата 25.4.2008, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



До обсурда опускаться не будем, ладно? Естественно, что if/else - неотъемлемая часть. Я имею виду, когда у вас некая переменная может иметь несколько значений и вы должны по каждому из них произвести соответствующие действия.


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Rodman
Дата 25.4.2008, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: нет
Всего: 122



Цитата(Rickert @  25.4.2008,  09:16 Найти цитируемый пост)
Ведь он, по сути пострен на goto принципе.
фигасе!


PM MAIL WWW Skype GTalk YIM MSN   Вверх
Lazin
Дата 25.4.2008, 09:52 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Юзаю иногда...
Но обычно роль switch-а в моих программах выполняет таблица виртуальных функций
PM MAIL Skype GTalk   Вверх
GrayCardinal
Дата 25.4.2008, 09:53 (ссылка)   | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 2
Всего: 58



Цитата

Все вот говорят, что мол нельзя юзать goto - Небезопасно это.

Кто - "все" ? Я вот не говорю. Вообще goto редко, но юзаю, ибо есть некоторые моменты, когда с goto самый красивый вариант. То же с switch/case



Это сообщение отредактировал(а) GrayCardinal - 25.4.2008, 09:54


--------------------
PM MAIL WWW   Вверх
Rickert
Дата 25.4.2008, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Я тоже раньше думал что глобальные переменные - это нормально и ничего зазорного.


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
GrayCardinal
Дата 25.4.2008, 10:15 (ссылка) |   (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 2
Всего: 58



Rickert
СЛушай, добрый совет забей ты на шаблонное мышление. Тебе надо ? Так пиши хоть goto, хоть глобальные переменные. Вон хлопцы написали Perl 6 (Pugs) на Haskell и сидят - торчат, какие мы крутые, А вы тут про гооту и глобальные переменные  smile 

Это сообщение отредактировал(а) GrayCardinal - 25.4.2008, 10:16


--------------------
PM MAIL WWW   Вверх
MAKCim
Дата 25.4.2008, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



вообще, самое красивое применение goto я видел в совокупности с применением расширения компилятора gcc
что-то вроде этого
Код

    int state = 0;
    void * jumps[5] = {&&state1, &&state2, &&state3, &&state4, &&state5};
...
state1:
/* в этом месте для каждой метки идет проверка некоторого инварианта и, возможно, осуществляется прямой переход на какую-то другую метку */
...
    goto *jumps[state];
state2:
...
    goto *jumps[state];
state3:
...
    goto *jumps[state];
state4:
...
    goto *jumps[state];
state5:
...
    goto *jumps[state];

в каждом из stateX state изменяется по определенному алгоритму
перепишите ка этот пример без goto  smile 
число переходов недетерминировано (т. е мы не знаем сколько раз будет выполняться goto *jumps[state])

Это сообщение отредактировал(а) MAKCim - 25.4.2008, 10:32


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
mes
Дата 25.4.2008, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Rickert @  25.4.2008,  09:16 Найти цитируемый пост)
Все вот говорят, что мол нельзя юзать goto - Небезопасно это..

Не нельзя, а нежелательно. 

 А небезопасно потому, что "goto "  [goto label1]

label4:  Поэтому вместо того чтоб его использовать  [goto label5]
label1: не вкладывается в стиль языка   [goto label2]
label3: и затрудняет понимание ее же для самого же программиста   [goto label4]
label2: "давит" конструкцию программы   [goto label3]
label5: лучше и легче перефрзировать мысль 

Что вышеперечисленное  будет выглядеть без "goto"  приятнее, я думаю, спорить не будешь )) 

Бывают и красивые решения с "goto" - но человек должен хорошо чуствовать что он хочет.
A если он знает - то ему запреты и не нужны, но если бы не было бы "запретов" то многие  бы вместо того чтоб сформулировать мысль писали бы кучу goto.

Цитата(Rickert @  25.4.2008,  09:16 Найти цитируемый пост)
Но сами юзают switch. Ведь он, по сути пострен на goto принципе.

так и return на том же принципе основон - только ты не в те принципы глядишь. Реализация команд на машинном языке не имеет никакого отношения к принципам  высокоуровневого языка . 

Цитата(Rickert @  25.4.2008,  09:16 Найти цитируемый пост)
Ваше мнение и что обычно юзаете: switch/case или if/else ? 

если надо проверить состояния одного объекта то "switch"
если другие условия то " if ".




Это сообщение отредактировал(а) mes - 25.4.2008, 10:27


--------------------
PM MAIL WWW   Вверх
Rickert
Дата 25.4.2008, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Ага, спасибо за совет, я последнии несколько лет его придерживался, пока не понял что за деньги платят.


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
MAKCim
Дата 25.4.2008, 10:18 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(GrayCardinal @  25.4.2008,  10:15 Найти цитируемый пост)
СЛушай, добрый совет забей ты на шаблонное мышление. Тебе надо ?

+1  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Mayk
Дата 25.4.2008, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(MAKCim @  25.4.2008,  14:16 Найти цитируемый пост)

в каждом из stateX state изменяется по определенному алгоритму
перепишите ка этот пример без goto  smile 
число переходов недетерминировано (т. е мы не знаем сколько раз будет выполняться goto *jumps[state]) 

не совсем понял что делает этот код. дай угадаю. наверное что-то типа этого:
Код

typedef enum{State1...StateEND} state_t;

void terribleFunction()
{
      state_t state = State1;
 
      do{
          switch(state){
                case State1: state = State2; break;
                case State2: state = foo ? State2 : State3; break;
                ......
          }
      }while(state != StateEND)       
}







--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
MAKCim
Дата 25.4.2008, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Mayk
я уже не помню, где я это видел (код мой, он просто принцип показывает)

Цитата(Mayk @  25.4.2008,  10:29 Найти цитируемый пост)
не совсем понял что делает этот код. дай угадаю. наверное что-то типа этого:

нет
это просто динамический конечный автомат

Добавлено через 1 минуту и 52 секунды
Mayk
в твоем коде каждая итерация влечет за собой большое число проверок условий (число растет пропорционально числу состояний)


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
SABROG
Дата 25.4.2008, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



А мне из-за шаблонного мышления пришлось отказаться от такого варианта:

Код

for(int i=0; i < N; i++)
{
    label:
    ...
    goto label;
}

к такому
Код

for(int i=0; i < N; i++)
{
    ...
    --i;
}


И до сих пор меня терзают смутные сомнения, все время задаю себе вопрос: "На машинном уровне это jmp/loop + dec eax + cmp eax,N. Т.е. 3 долгих операции вместо одного jmp'a... Нафига мне оно надо было ? Из-за шаблонного мышления!


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1427 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.