Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
satay
Зарегистрирован: 25.03.2005 Сообщения: 77 Откуда: Ukraine
|
Добавлено: Сб Сен 03 2005 23:15 Заголовок сообщения: ??swith?? |
|
|
на Паскале есть такая штука
case a of
10..20:
....
и т.д. вообшем можно указать промежуток значений
ЕСТЬ ЛИ ТАКОЕ в Си? _________________ Satay |
|
Вернуться к началу |
|
|
Aragaer
Зарегистрирован: 28.03.2005 Сообщения: 164
|
Добавлено: Сб Сен 03 2005 23:36 Заголовок сообщения: |
|
|
Намного правильнее пользоваться не switch'ом, а else if'ами
Код: | if (условие1) {
...
} else if (условие2) {
...
} else if (условие3) {
...
} else {
...
} |
_________________ Open your eyes.
And Awaken. |
|
Вернуться к началу |
|
|
Wladimir
Зарегистрирован: 02.03.2005 Сообщения: 150 Откуда: Ставропольский край
|
Добавлено: Вс Сен 04 2005 09:00 Заголовок сообщения: |
|
|
Нету. Можно либо пользоваться серией ifов, либо ставить несколько case подряд:
case 10:
case 11:
case 12:
тело;
break; |
|
Вернуться к началу |
|
|
kolobok0
Зарегистрирован: 22.04.2005 Сообщения: 253 Откуда: Мсква
|
Добавлено: Пн Сен 05 2005 11:44 Заголовок сообщения: |
|
|
Aragaer писал(а): | Намного правильнее пользоваться не switch'ом, а else if'ами......... |
Правильней с какой кочки зрения то ?
Например с кочки зрения оптимизации по скорости на множестве ифов - Вы ГЛУБОКО ОШИБАЕТЕСЬ (и чем больше условий - тем больше погрешность) ! После 3, 4 ифов Вы будете писать уже тормозной код...
с уважением
(круглый) |
|
Вернуться к началу |
|
|
Aragaer
Зарегистрирован: 28.03.2005 Сообщения: 164
|
Добавлено: Пн Сен 05 2005 15:08 Заголовок сообщения: |
|
|
С точки зрения гибкости.
В switch'е мы можем проверять только целые числа. Точнее различные значения одного целого числа. Последовательность else if'ов позволяет работать с любыми видами данных, не одной переменной, а несколькими, позволяет осуществлять short-circuit (как бы это по-русски... вобщем как операторы and и or в перле) вычисления.
И... мне например не очень понятно, почему последовательность else if'ов будет работать медленнее, чем switch. _________________ Open your eyes.
And Awaken. |
|
Вернуться к началу |
|
|
kolobok0
Зарегистрирован: 22.04.2005 Сообщения: 253 Откуда: Мсква
|
Добавлено: Вт Сен 06 2005 11:01 Заголовок сообщения: |
|
|
Aragaer писал(а): | ....например не очень понятно, почему последовательность else if'ов будет работать медленнее, чем switch. |
Если скомпилируете код с ифами и со свитчем (и там и там целые) то увидите нечто такое...
а) ифы..
cmp eax,00110033h
jc
бла...бла..бла
cmp eax,00000044h
jc
бла...бла..бла
б) со свитчами...
load edx,[TABLE_SWITCH + eax]
jmp [edx]
за точность до запятой не ручаюсь (тут опущено приведение к размерности таблице и т.д.) - давно не брал в руки шашек по азму 86 и иже... а вот смысл надеюсь передал...т.е. в первом случае Вы будете ДРУГ ЗА ДРУГОМ перебирать все варианты (до совпадения конечно же). Во втором будет ПРЯМОЙ переход к коду обрабатывающий данное равенство. Понятно, что второй вариант будет МЕДЛЕННЕЕ лишь в том случае, когда тактов для вычислений и переход к коду будет БОЛЬШЕ чем кол-во тактов при обработке несколько ифов (сколько - нуна точнее смотреть на код получаемый после компилятора). Посему рекомендация такая... Если ифов больше чем два-три и размерность элементов - целые, то лучше использовать свитч.
Отсюда кстати и понятно, почему размерность единиц сравнения не больше размерности регистра
с уважением
(круглый)
ЗЫ
Понятие медленный и быстрый - это ессесвенно с оговоркой, что РАСПРЕДЕЛЕНИЕ комбинаций переходов будут РАВНОМЕРНЫ. |
|
Вернуться к началу |
|
|
Aragaer
Зарегистрирован: 28.03.2005 Сообщения: 164
|
Добавлено: Вт Сен 06 2005 23:25 Заголовок сообщения: |
|
|
Ну в таком случае для целых чисел можно провернуть совсем хитрую операцию: написать кучу мелких подпрограмм и указатели на них закинуть в какой-нибудь массив. Правда это уже изврат. _________________ Open your eyes.
And Awaken. |
|
Вернуться к началу |
|
|
kolobok0
Зарегистрирован: 22.04.2005 Сообщения: 253 Откуда: Мсква
|
Добавлено: Ср Сен 07 2005 11:02 Заголовок сообщения: |
|
|
Aragaer писал(а): | Ну в таком случае для целых чисел можно провернуть совсем хитрую операцию: написать кучу мелких подпрограмм и указатели на них закинуть в какой-нибудь массив. Правда это уже изврат. |
это и есть SWITCH !
(круглый) |
|
Вернуться к началу |
|
|
DmitryShm
Зарегистрирован: 17.11.2003 Сообщения: 211 Откуда: Казань
|
Добавлено: Ср Сен 07 2005 13:41 Заголовок сообщения: словоблуды |
|
|
словоблуды _________________ love IT |
|
Вернуться к началу |
|
|
Aragaer
Зарегистрирован: 28.03.2005 Сообщения: 164
|
Добавлено: Ср Сен 07 2005 15:29 Заголовок сообщения: |
|
|
kolobok0 писал(а): | это и есть SWITCH !
(круглый) |
Не совсем
Во-первых, нет явного перескакивания между подпрограммами, кроме заданных явно (а-ля автоматически прописанные break'и).
Во-вторых, эти подпрограммы могут быть использованы неоднократно (я не представляю себе, насколько должен быть умным компилятор, чтобы несколько разных свичей слить вместе в тех местах, где выполняемые функции одинаковы).
В-третьих, есть возможность динамически менять соответствие значение переменной выбора - подпрограмма. _________________ Open your eyes.
And Awaken. |
|
Вернуться к началу |
|
|
kolobok0
Зарегистрирован: 22.04.2005 Сообщения: 253 Откуда: Мсква
|
Добавлено: Чт Сен 08 2005 13:19 Заголовок сообщения: |
|
|
Aragaer писал(а): | .....Во-первых.... |
Вы сами себе противоречите...Отличие подпрограммки, метода, функции от тупого перехода да, мона найти (и оно существует ессесвенно). Но предложенный Вами вариант создания таблицы и будет в своём корне свитч. А по поводу универсальности программ - круто, но тому что Вы написали выше - противоречит. Ведь обьеденив в таблицу подпрограммки с различными параметрами - Вам надо будет и специфицировать эти самые параметры до вызова, их кол-во...Так что экскурс в механизацию повторно используемого кода был мягко говоря не в тему... А сделать мона всё...если сильно захотеть...
Вопрос стоял о скорости выполнения. Я разьяснил. И как говорил один профессор математики выводя на память доказательство теорем - "Кто не верит, пусть проверит."
удачи Вам
(круглый)
ЗЫ
Считаю, что вопросов по теме оптимальности у Вас не осталось... |
|
Вернуться к началу |
|
|
Aragaer
Зарегистрирован: 28.03.2005 Сообщения: 164
|
Добавлено: Чт Сен 08 2005 15:07 Заголовок сообщения: |
|
|
Сдаюсь. Пытался подвести какую-то логическую основу под то, что я не люблю switch'и и не умею ими пользоваться. В результате наговорил кучу ерунды _________________ Open your eyes.
And Awaken. |
|
Вернуться к началу |
|
|
|