Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/76: Рейтинг темы: голосов - 76, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 36

Возврат к началу switch

02.05.2014, 22:42. Показов 14682. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.

Есть программа, включающая в себя
C++
1
2
3
4
5
6
7
8
...
switch(x)
{
case 1: {};
case 2: {};
case n: {};
default: {};
}
Как сделать так, чтобы этот switch выполнялся до тех пор, пока не выберется один из case.

Например, есть меню из 5 пунктов. Как сделать так, чтобы при вводе числа 6 программа не закрывалась, а снова выводила это меню.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.05.2014, 22:42
Ответы с готовыми решениями:

Возврат к началу цикла
Всем добрый вечер. Имеется цикл, в котором записано 2 условия, по которым выполняется то или иное действие и программа через goto...

Возврат к началу при открытии новых ссылок
Доброго времени суток! На ноутбуке столкнулся с проблемой - при открытии новой ссылки(папки в моём компьютере либо переход на новую...

Возврат обратно в меню, в операторе switch
Я написал программу, которая выводит на экран меню блюд, при нажатии клавишы выводится название блюда, как сделать так чтобы после нажатия...

22
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,819
04.05.2014, 01:20
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от stawerfar Посмотреть сообщение
На всякий случай если вдруг не знали почитайте в стандарте языка значение оператора inline где вы прочтете что данная команда носит лишь рекомендательный характер в отличие от define. Эти топкости нужно знать. Или просто почаще смотреть понял ли вас компилятор при генерации кода асм
Если ты не понял о чем я говорю, это не значит, что я дурак
Во-первых inline в первом тесте не было вообще. Компилятор сам принял решение о встраивании.
Во-вторых, я пишу одно, а ты читаешь совершенно другое, сам придумываешь, потом сам же разоблачаешь -- нехорошо.
В третьих не надо отправлять меня в стандарт. Эта тема его мало касается. Т.к. мы говорим об оптимизации, а о ней там ни слова.
В четвертых в стандарт я и сам могу кого хочешь отправить

В общем, смотри еще раз:
Цитата Сообщение от DrOffset Посмотреть сообщение
при сохранении возможности "заинлайнить" accept, совершенно неважно что внутри него вызывается
Что тут не понятного?
Я где-то утверждал, что в случае невозможности встроить accept код будет другим?
Вот ты пишешь:
Цитата Сообщение от stawerfar Посмотреть сообщение
Попробуй в тело switch добавить пару функций да так что бы значения результатов было трудно прогназируемо
А я говорю, что добавление чего-то в тело switch не повлияет в целом на работу, если только мы не создадим условия, при которых невозможно будет встроить accept. Обеспечение эти условий - это отдельный разговор, и я даже не пытался его касаться.
Пример, я специально его не писал, потому что я знал что будет, а не потому что мне лень или еще что. Но раз ты так хочешь, то вот:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
extern "C" int foo1(); // эти функции определены в другой единице трансляции
extern "C" int foo2(); // поэтому компилятор НЕ может предположить что-то об их результате, как ты и хотел
 
extern "C" int test1()
{
    int x = 0;
    bool run = true;
 
    while(run)
    {
        run = false;
        std::cin >> x;
 
        switch(x)
        {
        case 1: run = foo1() != 2; break;
        case 2: run = foo2() != 1; break;
        case 3: break;
        default:
            run = true;
        }
    }
    return 0;
}
 
inline bool accept(int x)
{
    switch(x)
    {
    case 1:
        return foo1() != 2;
    case 2:
        return foo2() != 1;
    case 3:
        return true;
    default:
        return false;
    }
}
 
extern "C" int test2()
{
    int x = 0;
    while( std::cin >> x, !accept(x) );
    return 0;
}
 
int main()
{
}
Вот что получилось.
Это код БЕЗ функции. Цифрами пронумерованы прыжки.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
_test1:
    push    ebx
    sub esp, 40
    mov DWORD PTR [esp+28], 0
    lea ebx, [esp+28]
L14:
    mov DWORD PTR [esp], ebx
    mov ecx, OFFSET FLAT:__ZSt3cin
    call    __ZNSirsERi
    push    eax
    mov eax, DWORD PTR [esp+28]
    cmp eax, 2
    je  L6  ;#1
    cmp eax, 3
    je  L7  ;#2
    dec eax
    jne L14 ;#3
    call    _foo1
    cmp eax, 2
    setne   al
L8:
    test    al, al
    jne L14 ;#4
L7:
    xor eax, eax
    add esp, 40
    pop ebx
    ret
L6:
    call    _foo2
    dec eax
    setne   al
    jmp L8  ;#5
Вот код с функцией:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
_test2:
    push    ebx
    sub esp, 40
    mov DWORD PTR [esp+28], 0
    lea ebx, [esp+28]
L32:
    mov DWORD PTR [esp], ebx
    mov ecx, OFFSET FLAT:__ZSt3cin
    call    __ZNSirsERi
    push    edx
    mov eax, DWORD PTR [esp+28]
    cmp eax, 2
    je  L20 ;#1
    cmp eax, 3
    je  L21 ;#2
    dec eax
    jne L32 ;#3
    call    _foo1
    cmp eax, 2
    setne   al
L22:
    test    al, al
    je  L32 ;#4
L21:
    xor eax, eax
    add esp, 40
    pop ebx
    ret
L20:
    call    _foo2
    dec eax
    setne   al
    jmp L22 ;#5
Компилятор mingw 4.7.2. Опции -02, -save-temps, -masm=intel.
Я намеренно допустил мааленькое расхождение в двух примерах. В первом примере результат сравнения с foo1() и foo2() берется без инверсии, а во втором - с инверсией (помним про !accept() в цикле). Эта разница хорошо видна на метке #4. На этом различия (ну кроме имен меток, естественно) заканчиваются.
2
 Аватар для stawerfar
150 / 64 / 8
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
04.05.2014, 01:39
Большинство споров из за того что люди говорят совершенно о разных вещах. Ладно я понял что ты имел введу пожалуй пора заканчивать с этим. Спасибо за диалог
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,819
04.05.2014, 01:53
В общем, я для ясности хочу вот что добавить.
1) Я знаю, что компилятор может не встроить функцию.
2) Я знаю, что теоретически эти примеры могли бы быть совсем разными (если взять какой-нибудь gcc 2.95 - это точно будет так)
3) Я знаю, что рассчитывать только на компилятор и писать говнокод в надежде на оптимизацию - это плохо.
Но, я так же знаю, что:
1) "Преждевременная оптимизация корень всех зол".
2) Современные компиляторы достаточно умны, чтобы генерировать оптимальный машинный код из кода с приемлемым количеством абстракций, увеличивающих читаемость. Т.е. не обязательно сейчас (в 2014 году), имея современные инструменты, писать приближенный к ассемблеру код, как это было принято раньше. Однако это не значит, что это дает нам право впадать в крайности (см п.3 первого абзаца).

В общем, пойнт в том, что код который дал Tulosba НЕ является крайностью и НЕ является гонокодом, т.к. содержит минимальный необходимый набор абстракций для увеличения читаемости кода, но в то же время позволяет компилятору провести все необходимые оптимизации на том же уровне, что и в коде без таких абстракций. Это то, чего достигла современная индустрия, мы теперь можем писать чуть более высокоуровневый код, без опасения, что он будет неоптимален. В конце концов текст программы пишется и для человека тоже. Его потом нужно сопровождать и понимать другим людям.
Поэтому сейчас всем известные классики пишут, и я с ними согласен на 100%, что если не дано специальных условий, приемлемым подходом будет писать код максимально точно описывающий и решающий задачу, а не код, который будет выигрывать такты и байты, при этом маскируя и размазывая алгоритм в своих деталях (за деревьями не видно леса - пословица очень в тему). А решение об оптимизации принимать уже после профилирования.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.05.2014, 01:53
Помогаю со студенческими работами здесь

Возврат в начало функции из блока Switch
Можно ли вернуться как-то из switch(deystvie)/(deystvie2) или из любого его case в самое начало (меню)? Если да, то как? #include...

Как сделать чтобы Switch работал в другом Switch'e?
Как сделать что бы Switch работал в другом Switch'e? Вот допустим выбираем один пункт и в зависимости от выбранного нами пункта последующие...

Switch . Как присвоить переменной значение из Switch в default
Добрый день подскажите как реализуется данный код . Как взять значение switch если выпал default ? public int Parse() { int...

Рефакторинг switch внутри switch в static классе
Добрый день. Подскажите, как корректно обойти конструкцию switch case внутри switch case в статическом классе. Наткнулся на stackoverflow...

Power Switch и Reset Switch
Здравствуйте. Покажите мне пожалуйста на этой материнской плате где находится power switch пин и reset switch... Благодарю от всей души.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
Новые блоги и статьи
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru