Преимущество переключения оператора if-else - PullRequest
157 голосов
/ 19 сентября 2008

Как лучше всего использовать оператор switch по сравнению с использованием оператора if для перечислений 30 unsigned, где около 10 имеют ожидаемое действие (в настоящее время это то же самое действие). Производительность и пространство необходимо учитывать, но это не критично. Я абстрагировал фрагмент, поэтому не ненавидите меня за соглашения об именах.

switch оператор:

// numError is an error enumeration type, with 0 being the non-error case
// fire_special_event() is a stub method for the shared processing

switch (numError)
{  
  case ERROR_01 :  // intentional fall-through
  case ERROR_07 :  // intentional fall-through
  case ERROR_0A :  // intentional fall-through
  case ERROR_10 :  // intentional fall-through
  case ERROR_15 :  // intentional fall-through
  case ERROR_16 :  // intentional fall-through
  case ERROR_20 :
  {
     fire_special_event();
  }
  break;

  default:
  {
    // error codes that require no additional action
  }
  break;       
}

if оператор:

if ((ERROR_01 == numError)  ||
    (ERROR_07 == numError)  ||
    (ERROR_0A == numError)  || 
    (ERROR_10 == numError)  ||
    (ERROR_15 == numError)  ||
    (ERROR_16 == numError)  ||
    (ERROR_20 == numError))
{
  fire_special_event();
}

Ответы [ 23 ]

0 голосов
/ 19 сентября 2008

Поскольку у вас есть только 30 кодов ошибок, закодируйте свою собственную таблицу переходов, затем вы сделаете все варианты оптимизации самостоятельно (переход всегда будет самым быстрым), а не надеетесь, что компилятор поступит правильно. Это также делает код очень маленьким (кроме статического объявления таблицы переходов). Это также имеет дополнительное преимущество, заключающееся в том, что с помощью отладчика вы можете изменять поведение во время выполнения, если вам это необходимо, просто перетаскивая данные таблицы напрямую.

0 голосов
/ 23 февраля 2017

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

позволяет вам тестировать переменную по определенным диапазонам Вы можете использовать функции (Стандартная библиотека или Личные) в качестве условных выражений.

(пример:

`int a;
 cout<<"enter value:\n";
 cin>>a;

 if( a > 0 && a < 5)
   {
     cout<<"a is between 0, 5\n";

   }else if(a > 5 && a < 10)

     cout<<"a is between 5,10\n";

   }else{

       "a is not an integer, or is not in range 0,10\n";

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

`int a;
 cout<<"enter value:\n";
 cin>>a;

 switch(a)
 {
    case 0:
    case 1:
    case 2: 
    case 3:
    case 4:
    case 5:
        cout<<"a is between 0,5 and equals: "<<a<<"\n";
        break;
    //other case statements
    default:
        cout<<"a is not between the range or is not a good value\n"
        break;

Я предпочитаю заявления if - else if - else, но это действительно ваше дело. Если вы хотите использовать функции в качестве условий, или вы хотите проверить что-то на диапазоне, массиве или векторе и / или вы не против иметь дело со сложным вложением, я бы порекомендовал использовать блоки If if if else. Если вы хотите проверить на единичные значения или хотите получить чистый и легко читаемый блок, я бы порекомендовал вам использовать блоки case ().

0 голосов
/ 19 сентября 2008

Я бы сказал, используйте переключатель. Таким образом, вам нужно только реализовать разные результаты. Ваши десять одинаковых кейсов могут использовать по умолчанию. Если нужно изменить все, что вам нужно, это явно реализовать это изменение, не нужно редактировать значение по умолчанию. Также гораздо проще добавлять или удалять дела из SWITCH, чем редактировать IF и ELSEIF.

switch(numerror){
    ERROR_20 : { fire_special_event(); } break;
    default : { null; } break;
}

Может быть, даже проверить ваше состояние (в данном случае numerror) по списку возможностей, возможно, по массиву, чтобы ваш SWITCH даже не использовался до тех пор, пока определенно не будет результата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...