2012-03-30 4 views
3

спасибо за ответы.если внутри корпуса коммутатора, чтобы ограничить случаи

Я хотел бы знать, можно ли ограничить некоторые случаи выражения swtich-case, используя условные выражения. Как и код, следующий.

switch(a) 
{ 
    case 1: 
    { 
     do_1(); 
     break; 
    } 
    case 2: 
    { 
     do_2(); 
     break; 
    } 

    if(condition) 
    { 
     case 3: 
     { 
      do_3(); 
      break; 
     } 

     break; 
    } 
} 

Отредактировано, извините, ребята, я получил неправильное условие, это не связано вообще с переключаемой переменной. Просто другое условие, внешнее. Я просто хочу знать, могу ли я ограничивать случаи внешними условиями, иначе, случаи внутри IF не будут анализироваться, если условие не выполняется.
Нужен ли мне второй прорыв внутри if?

+4

что бы это состояние быть? Я имею в виду «a» - это число, это не имеет никакого смысла. – talnicolas

+5

Переместить условное выражение в тело 'case'. Помните, что 'switch/case' - просто причудливый' goto'. –

+1

Что касается * кейс состояние: *? –

ответ

9

Короткий ответ - нет. Вы должны были бы изменить порядок:

case 3: 
    if (condition) 
     do_3(); 
    break; 
+0

Перерыв должен выйти ** вне ** 'if', иначе он провалится! – egrunin

+0

Но это глупо ... он уже включен 'a'. 'a' может * только * быть' 3' в этом случае. –

+0

@egrunin: хорошая точка (хотя, как написано, не имеет значения, так как '3' был последним случаем в' switch'). –

3

Нет, вы это делаете:

case 3: 
    { 
     if (a == condition) 
      do_3(); 
     break; 
    } 

    break; 
+0

Но это глупо ... он уже включен 'a'. 'a' может * только * быть' 3' в этом случае. –

+0

Я знаю, неясно, что он на самом деле думает. – egrunin

+0

@egrunin: Вопрос обновлен, теперь имеет больше смысла. –

2

два способа, что это может быть сделано, являются:

  1. Использование препроцессор макросов, предполагая, что ваше состояние может быть проверено таким образом.

    #ifdef condition 
        case 3: 
        { 
    
         do_3(); 
         break; 
        } 
    #endif 
    
  2. Перемещение if заявления внутри case блока.

    case 3: 
    { 
        if (a == condition) 
         do_3(); 
        break; 
    } 
    
+0

Я думаю, что это тот порядок, который вы имели в виду, чтобы привести примеры. По крайней мере, теперь люди могут их прочитать. –

+2

"* То, что вы написали, является недопустимым синтаксисом. *" Нет, то, что он написал, является вполне допустимым синтаксисом. http://ideone.com/I4fy2 –

+0

@ Rob: Теперь это очень интересно. Вы должны ответить на этот вопрос (возможно, объясняя, является ли это функцией GCC или чем-то еще). –

3

Либо проверить состояние в каждом конкретном случае:

switch(a) 
{ 
    case 1: 
    { 
     do_1(); 
     break; 
    } 

    case 2: 
    { 
     do_2(); 
     break; 
    } 

    case 3: 
    { 
     if (condition) 
      do_3(); 
     break; 
    } 

    case 4: 
    { 
     if (condition) 
      do_4(); 
     break; 
    } 
} 

Или использовать default блок с второй switch:

switch(a) 
{ 
    case 1: 
    { 
     do_1(); 
     break; 
    } 

    case 2: 
    { 
     do_2(); 
     break; 
    } 

    default: 
    { 
     if (condition) 
     { 
      switch (a) 
      { 
       case 3: 
       { 
        do_3(); 
        break; 
       } 

       case 4: 
       { 
        do_4(); 
        break; 
       } 
      } 
     } 

     break; 
    } 
} 
0

Вы никогда не сможете Погружает если условие там, так как оно не работает с синтаксисом C++. Вы должны переместить # 3 за пределы оператора case или сделать его частью случая по умолчанию и проверить состояние там.

0

C++ не поддерживает это. Но вы можете использовать вызовы функций для разделения коммутатора на части, чтобы уменьшить дублирование кода. Если вы пытаетесь сделать что-то вдоль этих линий:

void func() 
{ 
    switch(a) 
    { 
     case 1: 
     { 
      do_1(); 
      break; 
     } 
     case 2: 
     { 
      do_2(); 
      break; 
     } 

     if(condition) 
     { 
      case 3: 
      { 
       do_3(); 
       break; 
      } 

      case 4: 
      { 
       do_3(); 
       break; 
      } 

      case 5: 
      { 
       do_3(); 
       break; 
      } 
      break; 
     } 
    } 
} 

Вы можете разбить его так:

void func() 
{ 
    if(!func_a(a) && condition) 
     func_b(a); 
} 

bool func_a(a) 
{ 
    switch(a) 
    { 
     case 1: 
     { 
      do_1(); 
      return 1; 
     } 
     case 2: 
     { 
      do_2(); 
      return 1; 
     } 

     default: return 0; 
    } 
} 

void func_b(a) 
{ 
    switch(a) 
    { 
     case 3: 
     { 
      do_3(); 
      break; 
     } 

     case 4: 
     { 
      do_3(); 
      break; 
     } 

     case 5: 
     { 
      do_3(); 
      break; 
     } 
    } 
} 
Смежные вопросы