2012-03-29 10 views
7

L'estensione del campo di caso GNU permette caso varia in istruzioni switch:Conversione caso estensione del campo di GNU allo standard C

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

Come ti convertire questo allo standard C (C99, C89 o)? Aggiungi le dichiarazioni dei singoli casi?

Modifica: come gestireste le istruzioni switch molto grandi in modo specifico?

risposta

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: Per rispondere al commento.
Se si dispone di troppi casi, allora si potrebbe prendere in considerazione la sostituzione del switch-case con if-else costrutti. Può essere molto più pulito, conciso & leggibile.

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

Sto provando a sostituire un caso 32 ... 126: :) Sarà una lunga istruzione switch ... – Ynv

+0

C'è un modo per generare questi casi con il preprocessore C? – Ynv

+0

@Ynv: potresti voler passare a utilizzare una serie di istruzioni if-else. –

2

Se lungo raggio tempo si poteva fare, un po 'sporco ma,

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

La cosa migliore sarebbe probabilmente essere quello di rimuovere l'interruttore per una, se tutti insieme.

Essere estremamente severi con il nesting. Se si desidera lo switch, per qualche motivo, quindi meglio di quanto sopra sarebbe:

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

Ach, mi dispiace per la modifica di nuovo. Questo sarebbe più pulito.

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

} else if (... 

} 

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

si usa un if dichiarazione:

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

è quindi possibile aggiungere ulteriori else if dichiarazioni se sono necessarie più intervalli,

2

In alternativa, dal momento che i numeri sono adiacenti l'uno all'altro, si può fare un'ottimizzazione manuale dell'interruttore.

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

Questo codice è fondamentalmente lo stesso di un interruttore-istruzione ottimizzata per il compilatore.

Problemi correlati