2012-03-29 6 views
7

Die GNU Fall Bereichserweiterung ermöglicht in Switch-Anweisungen Fall Bereiche:Konvertieren der Fall Bereichserweiterung GNU Standard C

switch (value) { 
    case 1 ... 8: 
     printf("Hello, 1 to 8\n"); 
     break; 
    default: 
     printf("Hello, default\n"); 
     break; 
} 

Wie würden Sie diese auf Standard-C konvertieren (C99 oder C89)? Fügen Sie die einzelnen Fallanweisungen hinzu?

Edit: Wie würden Sie besonders sehr große Schalteranweisungen handhaben?

Antwort

7
switch(value) 
{ 
    case 1: 
    case 2: 
    case 3: 
    case 4: 
    case 5: 
    case 6: 
    case 7: 
    case 8: 
     printf("Hello, 1 to 8\n"); 
     break;  
    default:   
     printf("Hello, default\n");   
     break; 
} 

EDIT: den Kommentar zu beantworten.
Wenn Sie zu viele Fälle haben, dann sollten Sie in Betracht ziehen, den Switch-Case durch zu ersetzen, wenn-sonst konstruiert. Es kann viel sauberer, präziser & lesbar sein.

if (value >=1 && value <= 8) 
{  
    printf("Hello, 1 to 8\n"); 
} 
else 
{ 
    printf("Hello, default\n"); 
} 
+2

Ich versuche, einen Fall zu ersetzen 32 ... 126: :) Es wird eine lange Switch-Anweisung sein ... – Ynv

+0

Gibt es eine Möglichkeit, diese Fälle mit dem C-Präprozessor zu generieren? – Ynv

+0

@Ynv: Sie können nur zu einer Reihe von If-Else-Anweisungen wechseln. –

2

Wenn lange lange Strecke könnten Sie tun, ein bisschen schmutzig, aber

switch(what) { 
case 1: 
    /* do 1 */ 
    break; 
case 2: 
    /* do 2 */ 
    break; 
default: 
    if (what > 31 && what < 127) { 
     /* do 32 to 126 */ 
    } 
} 

Am besten wäre wahrscheinlich sein, den Schalter für ein, wenn alle zusammen zu entfernen.

Seien Sie extrem streng mit der Verschachtelung. Wenn Sie den Schalter aus irgendeinem Grund wollen, dann besser als die oben wäre:

if (value > 31 && value < 127) { 
    /* Do something */ 
} else { 
    switch (value) { 
    case 1: 
     ... 
    } 
} 

Ach, wieder für die Bearbeitung sorry. Diese wäre sauberer.

if (value > 31 && value < 127) { 
    /* Do something */ 
} else if (value > 127 && value < 178) { 

} else if (... 

} 

switch (value) { 
case 1: 
    ... 
} 
3

Ich würde eine if Anweisung:

if (value >=1 && value <= 8) { 
    printf("Hello, 1 to 8\n"); 
} else { 
    printf("Hello, default\n"); 
} 

Sie können dann zusätzliche else if Anweisungen aus, wenn mehrere Bereiche erforderlich sind,

2

Alternativ kann, da die Zahlen einander benachbart sind, können Sie kann eine manuelle Optimierung des Schalterfalles vornehmen.

typedef void(*func_t)(void); 

#define CASES_N 9 

void func0 (void) 
{ 
    printf("Hello, 0\n"); 
} 

void func1 (void) 
{ 
    printf("Hello, 1 to 8\n"); 
} 

static const func_t execute [CASES_N] = 
{ 
    &func0, 
    &func1, 
    &func1, 
    &func1, 
    &func1, 
    &func1, 
    &func1, 
    &func1, 
    &func1 
}; 

int main() 
{ 
    if(what < CASES_N) 
    { 
    execute[what](); 
    } 
    else 
    { 
    printf("Hello, default\n"); 
    } 
} 

Dieser Code ist im Grunde das gleiche wie eine Compiler-optimierte switch-Anweisung.