2016-04-20 26 views
6

La mia logica è:Come posso utilizzare gli intervalli in un'istruzione switch case in C?

if number is between 1 to 10, execute first case statement 
if number is from 20 to 30, execute second case statement 

c'è una soluzione diversa da quella qui sotto?

case '1' ... '10': 
case '20' ... '30': 
+0

Le tue uniche opzioni sono fare come non vuoi o come suggerisce pzaenger. – Steve

+0

Se si desidera una soluzione non portatile, gcc può utilizzare il caso basato su intervallo. – Boiethios

+4

Intendi '1 ... 10', non' '1' ... '10''. E questo costrutto è un'estensione gcc, non standard C. –

risposta

4

Opzione 1: utilizzare case 0 per 0-9, case 1 per 11-20 e così via.

Opzione 2: utilizzare if

Opzione 3:

Un altro modo squallido sta usando caduta attraverso casi come questo:

#include <stdio.h> 

int main(void) { 
    int i=1; 

    for(i=1;i<=25;i++) 
    { 
    switch(i) 
    { 
     case 1: 
     case 2: 
     case 3: 
     case 4: 
     case 5: 
     case 6: 
     case 7: 
     case 8: 
     case 9: 
     case 10: 
      printf("%d is in between 1-10\n", i); 
      break; 

     case 11: 
     case 12: 
     case 13: 
     case 14: 
     case 15: 
     case 16: 
     case 17: 
     case 18: 
     case 19: 
     case 20: 
      printf("%d is in between 11-20\n", i); 
      break; 

     default: 
      printf("%d is above 20\n", i); 
    } 
    } 
    return 0; 
} 

uscita:

1 is in between 1-10 
2 is in between 1-10 
3 is in between 1-10 
4 is in between 1-10 
5 is in between 1-10 
6 is in between 1-10 
7 is in between 1-10 
8 is in between 1-10 
9 is in between 1-10 
10 is in between 1-10 
11 is in between 11-20 
12 is in between 11-20 
13 is in between 11-20 
14 is in between 11-20 
15 is in between 11-20 
16 is in between 11-20 
17 is in between 11-20 
18 is in between 11-20 
19 is in between 11-20 
20 is in between 11-20 
21 is above 20 
22 is above 20 
23 is above 20 
24 is above 20 
25 is above 20 

https://ideone.com/Cw6HDO

+0

grazie, ma se devo controllare per mille numeri – user3205621

+1

In tal caso, 'switch' potrebbe non essere la strada da percorrere. –

+1

Se devi controllare migliaia di numeri, dovresti averlo menzionato nella tua domanda originale. – abelenky

0

C non supporta i valori dei casi diversi dai singoli interi (o cose simili a interi - caratteri, valori di enumerazione). Quindi, le opzioni sono:

  • Come suggerito da pzaenger in un commento ormai cancellato: trasformare il numero che si sta lavorando con in qualcosa che può accensione (in questo caso, dividere per 10).
  • istruzioni case multipli (sfruttando falltrough): case 1: case 2: case 3: ... case 10: do_something();
  • Usa if piuttosto che case.
4
void SwitchDemo(int value) 
    { 
    switch(value/10) 
     { 
     case 0: ...; break; // 0 - 9 
     case 1: ...; break; // 10 - 19 
     ... 
     } 
    } 

o, specifico alla domanda intervalli:

void SwitchDemo(int value) 
    { 
    switch((value-1)/10) 
     { 
     case 0: ...; break; // 1 - 10 
     case 1: ...; break; // 11 - 20 
     ... 
     } 
    } 
-1

istruzioni switch in c possono operare solo su un'espressione costante, le istruzioni case non possono includere confronti dinamici.

Example of something which is, and is not, a "Constant Expression" in C?

Per qualcosa di questo semplice un if/struttura altro potrebbe essere più chiaro e più semplice, a seconda del compilatore vostra dichiarazione caso può essere tradotto in una serie di dichiarazioni di ramificazione di confronto in ogni modo.

+0

' switch() '** can ** gestisce un'espressione non costante nella porzione _expression_ di 'cambia (espressione) ...' – chux

10

I supporti compilatore GCC, come estensione lingua, case ranges come:

switch(i) { 
    case 0 ... 9: return true; 
    default: return false; 
} 

Questa estensione lingua è anche accettato da Clang/LLVM. Quindi usalo se puoi permetterti di limitare il tuo codice ai compilatori Clamp GCC &.

Vedere anche this.

Non ho idea del motivo per cui questa estensione non è stata inclusa nello standard C11.

0

Non sarà possibile farlo in C standard con una dichiarazione switch-case.
(come altre risposte hanno sottolineato, alcuni compilatore hanno estensioni non standard per permettere questo)

Invece, vi consiglio facendo un data-struttura come:

struct RangeData 
{ 
    int start; 
    int end; 
    void (*func)(int); 
}; 

RangeData ranges[] = { { 1, 10, Handle10s  }, 
         { 20, 30, Handle20s  }, 
         {5000, 10000, HandleBigNumbers} }; 

allora dovrebbe essere molto facile creare un piccolo loop che attraversa, trova l'intervallo corretto e chiama la funzione corretta.

void DoNumber(int value) 
{ 
    for(int i=0; i<ARRAYSIZE(ranges); ++i) 
    { 
     if (ranges[i].start <= value && value <= ranges[i].end) 
     { 
      ranges[i].func(value); 
     } 
    } 
}