2012-03-30 3 views
3

danke für die Antworten.wenn in einem Schalter Fall, Fälle zu beschränken

Ich würde gerne wissen, ob es möglich ist, einige Fälle einer swtich-case-Anweisung mit bedingten Ausdrücken zu beschränken. Wie der Code folgt.

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

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

     break; 
    } 
} 

Edited, sorry Jungs, ich habe die falsche Bedingung, es ist überhaupt nicht mit der geschalteten Variable verwandt. Nur eine andere Bedingung, externe. Ich möchte nur wissen, ob ich die Fälle mit externen Bedingungen einschränken kann, andernfalls werden Fälle innerhalb der IF nicht analysiert, wenn die Bedingung nicht erfüllt ist.
Brauche ich die zweite Pause innerhalb der if?

+4

was wäre diese Bedingung? Ich meine, "a" ist eine Zahl, es ergibt keinen Sinn. – talnicolas

+5

Verschieben Sie die Bedingung in den Körper des 'case'. Denken Sie daran, 'switch/case' ist nur ein schickes' goto'. –

+1

Was ist mit * Fallzustand: *? –

Antwort

9

Die kurze Antwort ist nein. Sie müssten die Reihenfolge umkehren:

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

Die Pause muss ** außerhalb ** der 'if' gehen, sonst wird es durchfallen! – egrunin

+0

Aber das ist albern ... es ist schon eingeschaltet "a". 'a' kann * nur * in diesem Fall' 3' sein. –

+0

@egrunin: guter Punkt (obwohl wie geschrieben, irrelevant, da '3' der letzte Fall im' switch' war). –

3

Nein, tun Sie dies:

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

    break; 
+0

Aber das ist albern ... es ist schon eingeschaltet "a". 'a' kann * nur * in diesem Fall' 3' sein. –

+0

Ich weiß, es ist nicht klar, was er wirklich denkt. – egrunin

+0

@egrunin: Frage aktualisiert, macht jetzt mehr Sinn. –

2

Die beiden Möglichkeiten, die es sind getan werden kann:

  1. Verwendung von Pre-Prozessor Makros, vorausgesetzt, dass Ihr Zustand auf diese Weise getestet werden kann.

    #ifdef condition 
        case 3: 
        { 
    
         do_3(); 
         break; 
        } 
    #endif 
    
  2. Bewegen Sie den if Anweisung innerhalb des case Block.

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

Ich denke, das ist die Reihenfolge, die Sie für die Beispiele verwenden wollten. Zumindest jetzt können die Leute sie lesen. –

+2

"* Was Sie geschrieben haben, ist eine ungültige Syntax. *" Nein, was er geschrieben hat, ist eine vollkommen gültige Syntax. http://ideone.com/I4fy2 –

+0

@Rob: Das ist jetzt sehr interessant. Sie sollten eine Antwort darauf geben (vielleicht erklären, ob dies eine GCC-Funktion oder etwas ist). –

3

Entweder prüfen Sie den Zustand in jedem Fall:

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; 
    } 
} 

Oder verwenden Sie einen default Block mit einem zweiten 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

Sie werden nie in der Lage sein, ein setzen wenn Bedingung, da es nicht mit C++ Syntax funktioniert. Sie sollten # 3 außerhalb der case-Anweisung verschieben oder es in den Standardfall einfügen und dort auf die Bedingung prüfen.

0

C++ unterstützt das nicht. Sie können jedoch Funktionsaufrufe verwenden, um den Switch in Teile aufzuteilen, um die Code-Duplizierung zu reduzieren. Wenn Sie versuchen, etwas in dieser Richtung zu tun:

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; 
     } 
    } 
} 

Sie es spalten könnte wie folgt auf:

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; 
     } 
    } 
} 
Verwandte Themen