2017-02-16 23 views
0

Можно ли перейти к случаю по умолчанию, пока я нахожусь в случае 1/2/и т. Д.?Переключиться на случай по умолчанию в корпусе коммутатора

switch(num) { 
    case 1: 
     if(foo) { 
      //do something 
     } else { 
      //go to default 
     } 

     ... 
     ... 
     ... 

    default: 
     //do something 
} 
+1

Нет, Java не поддерживает возможность «перейти» к корпусу коммутатора. – khelwood

+10

Это было бы ужасно. Просто создайте метод doDefault() и вызовите его из случая по умолчанию и из ветки else case 1. –

+0

Ужасно? C# имеет это. – Joe

ответ

5

Даже если вы измените num значение, когда вы находитесь в switch значение для Comparision является значение переменной перед тем начала переключателя, так что если вы вошли один из case веток вы не можете войти снова в default.

Однако вы можете сделать что-то вроде

boolean doDefault = false; 
switch(num) { 
    case 1: 
     if(foo) { 
      ... 
     } 
     else { 
      doDefault = true; 
     } 
     break; 
} 

if(doDefault) { 
    //do something 
} 
1

Не возможно, не имеет смысла в применении в режиме реального времени или в любом случае использования, но если вы хотите идти в неплатеже, чем вы можете сделать это с помощью любого из следующих

ПУТЬ
  1. Удалите все перерывы, чем вы будете по умолчанию по умолчанию.
  2. Вызов метода goDefault() со значением не соответствует ни одному case.
+0

Это имеет смысл. C# имеет это. – Joe

+0

, что бы вы хотели достичь, можно легко достичь, вызвав метод. Например, у нас есть 100 случаев из 50 из них, мы хотим выполнить некоторую общую задачу, создать метод и вызвать в них.Advantage default будет выполняться только после случая выполняется, и это можно вызвать где угодно. Вот почему Java не поддерживает его. –

+1

У этого есть использование, которое не может быть достигнуто с помощью метода goDefault: например. доступ к локальным переменным областям. Конечно, вы можете реализовать что-либо на Java, но неправильно сказать, что этот шаблон «не имеет смысла в любом случае». – Joe

0

Нет, вы не можете, но вы можете называть один и тот же метод или исключить перерывы.

0

Вы можете поставить их перед умолчанием и не тормозите в конце дел, то он будет выполнять все заявления до разрыва, независимо от того, что в случае

1

Вы могли бы написать логику, которая должна произойти в default блока в функции и вызвать его при необходимости:

void defAction(){ 
    printf("Hello, World!\n"); 
} 

int main() { 

    int num = 1, foo = 0; 

    switch(num) { 
     case 1: 
      if(foo) { 
       printf("Goodbye, World!\n"); 
      } else { 
       defAction(); 
      } 
      break; 
     default: 
      defAction(); 
    } 

    return 0; 
} 

Помните, что если дело не использует break;, все случаи под ним (в том числе default) также называют. Таким образом, если вы выходите из коммутатора if(foo), он перейдет к default. Это очень полезно, если вы хотите перейти на default не более одного case, и в этом случае вы положили case последнему, прямо перед default.

использовать с осторожностью/см комментарии ниже

switch(num) { 
    case 2: 
     // do sth 
     break; 
    case 3: 
     // do sth 
     break; 
    case 4: 
     // do sth 
     break; 
    case 1: 
     if(foo) { 
      printf("Goodbye, World!\n"); 
      break; 
     } 
     // ELSE don't break, use default 
    default: 
     defAction(); 
} 
+1

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

+1

@ OleV.V. ты прав! У меня лично нет проблем с такими решениями, но другие могут. Я отредактировал свой ответ соответственно ... – Barthy

1

Это можно сделать метод

switch(num) { 
    case 1: 
     if(foo) { 
      //do something 
     } else { 
      foo(); 
     } 
    default: 
     foo(); 
    } 
0

Вы достигаете это таким образом, ниже.

Предположим, вам нужно перейти к случаю по умолчанию после случая 1,2,8, только тогда вы можете написать ниже код.

switch(Choice){ 
    case 1 : //do something 
    case 2 : //do something 
    case 8 : //do something 
    default: //to do default operation 
    break; 
    case 3 : 
    case 4 : 
    } 
+1

, но если ему или ей нужно было перейти от случая 1, то, как вы предлагаете, также будут выполнены случай 2 и случай 8. Вероятно, это совсем не то, что он хочет. – Barthy

+0

Да, но это полезно, если блоки размером 2 и 8 пустые. –