C ++ Использование оператора switch - PullRequest
1 голос
/ 25 августа 2011
int i = 10;

switch( i )
{
    case 1:
        // do sth1
        break;

    case 2:
        // do sth2
        break;

    case 3:
        // do sth3
        break;

    default:
        // do sth default
        break;
}

Вопрос 1 > Когда выполняется оператор switch, переходим ли мы непосредственно к правильному регистру или мы ищем сверху вниз?

Ответ : Прямой переход к правильному регистру.

Вопрос 2 > Должны ли мы использовать оператор break после оператора по умолчанию?

Ответ : Зависит. Если оператор по умолчанию является последним оператором case, тогда использование break не требуется.

Правильно ли я получил ответы на поставленные выше вопросы?

Ответы [ 3 ]

4 голосов
/ 25 августа 2011

Вопрос 1: Зависит от компилятора. Стандарт C ++ не требует установки таблицы переходов.

Во многих случаях, особенно при небольшом числе редких случаев, GCC, MSVC и другие компиляторы будут выполнять проверку по пунктам (как если бы это было оператором if). В качестве примера, предположим, что ваши случаи были 1, 15 и 1000000. Было бы неэффективно выполнять код с прямым переходом.

gcc имеет опцию -fno-jump-tables, чтобы заставить его создать эквивалентный список if-else.

Вопрос 2: оператор break не требуется для последнего предложения. Он должен быть опущен, если выполнение должно быть прекращено.

1 голос
/ 25 августа 2011

Вы правы для второго ответа, за исключением того, что я бы добавил, что после оператора по умолчанию необходим разрыв, если это последний случай или , а это не так, и вы не хотите, чтобы он провалился. Но это просто придурок.

Ответ на первый вопрос зависит от того, включена ли оптимизация и насколько умен ваш компилятор. Если оптимизация низкая или отключена (или ваш компилятор просто старый и / или не очень сложный), он выполнит поиск сверху вниз, пропуская регистр по умолчанию (спасибо q0987). Если оптимизация включена и компилятор решит это сделать, она будет оптимизирована в таблицу переходов, и в этом случае она перейдет непосредственно к правильному случаю.

0 голосов
/ 25 августа 2011

Вопрос 1> Когда выполняется оператор switch, мы прыгаем прямо вправо регистр или мы ищем сверху вниз?

Я не думаю, что в стандарте есть упоминание об этой детали реализации. Тем не менее, ваш ответ правильный для этого.

Вопрос 2> Должны ли мы использовать оператор break после оператора по умолчанию?

Да, это зависит от требования. Иногда вам это может не понадобиться. Рассмотрим ситуацию, когда вы хотите что-то сделать для случая default: и немного менее важного для, скажем, case 1:. Например,

switch(i)
{
  default: foo();
  case 1:  bar();
           break;
  case 2:  abc();
           break;
  case 3:  xyz();
           break;
}
...