Я хотел знать, как правильно использовать переключатель / чехол - PullRequest
0 голосов
/ 24 августа 2010

Мне было просто интересно, может ли кто-нибудь дать мне пример использования switch / case.Я в некотором роде понимаю, но мне трудно понять, что и как я могу использовать.Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 24 августа 2010

Есть несколько вещей, которые нужно помнить о выражениях регистра переключателя:

a) Условие должно быть целочисленным / перечислимым / определяемым пользователем типом, который поддерживает преобразование в int или enum

b) метки case являются константами времени компиляции

в) Никакие два выражения метки регистра не могут иметь одинаковое значение

d) $ 6.4.2 / 5- "Когда выполняется оператор switch, его условие оценивается и сравнивается с каждой константой case. Если одна из констант case равна значению условия, управление передается оператор после метки совпадающего регистра. Если никакая константа регистра не соответствует условию и если есть метка по умолчанию, управление переходит к оператору, помеченному меткой по умолчанию. Если регистр не соответствует и если по умолчанию нет, то ни один из операторов в переключатель выполнен. "

e) $ 6.4.2 / 6 - «метки case и default сами по себе не изменяют поток управления, который беспрепятственно продолжается через такие метки. Чтобы выйти из коммутатора, см. Break»

enum direction {north, south, east, west};
char x;
class UD{
    operator int(){return 0;}
};

direction f1(){
    return north;
}

char f2(){
    return 'A';
}

int main(){
    direction d = f();
    string country;

    // switch condition of type enum
    switch(d){
    case north:
        country = "P";
        break;
    case south:
        country = "Q";
        break;
    case east:
        country = "R";
        break;
    case west:
        country = "S";
        break;
    default:
        country = "";
        break;
    }

    // switch condition of integral type
    switch(c){
    case 'A':
    case 'E':
    case 'I':
    case 'O':
    case 'U':
        cout << "Vowel";
        break;
    default:
        cout << "Not a Vowel";
        break;
    }

    UD u;

    // switch condition of user defined type (conversion to integral type)
    switch(u){
    case 0:
    case 1:
        cout << "Good";
        break;
    default:
        cout << "Not so good";
        break;
    }
}
1 голос
/ 24 августа 2010

Вот довольно типичный вариант использования. У вас есть список значений (перечисление) и переключатель, который проверяет ввод, чтобы определить, с чем вы имеете дело. Конечно, это предполагает, что действие, которое вы предпримите, зависит от значения enum.

enum ImageFormat
{
    FormatRGB888,
    FormatRGB8888,
    FormatRGB101010,
    FormatRGB161616,
    FormatRGB16161616
};

void SomeFunc(ImageFormat format)
{
    switch(format)
    {
        case FormatRGB888:
            // do stuff
            break;
        case FormatRGB8888:
            // do stuff
            break;
        case FormatRGB101010,
            // do stuff
            break;
        case FormatRGB161616:
            // do stuff
            break;
        case FormatRGB16161616:
            // do stuff
            break;
        default:
            // bad value for 'format'
    }
}
0 голосов
/ 24 августа 2010

Операторы Switch - это более эффективный способ выполнения множества ifs и elses.

0 голосов
/ 24 августа 2010

скажем, у вас есть перечисление

enum expr_type {
    EXPR_TYPE_ADD,
    EXPR_TYPE_SUBTRACT,
    EXPR_TYPE_GET_VALUE
};

Мы можем переключиться на это:

enum expr_type t = /* get input somehow and find the type */;

switch(t) {
    case EXPR_TYPE_ADD:
         cout << "Operator Add";
         /* fall through */
    case EXPR_TYPE_SUBTRACT:
         cout << "Operator (Add or Subtract)";
         break;
    case EXPR_TYPE_GET_VALUE;
         cout << "Getting some value";
         break;
}

Вы должны положить в перерыв; так что это не произойдет - в настоящее время EXPR_TYPE_ADD будет выдавать весь код для EXPR_TYPE_SUBTRACT. Обязательно используйте break правильно!

...