Forum: Compiler & IDEs Wertebereich in switch / case Anweisung


von Jörg (Gast)


Lesenswert?

Hallo,

ich bin gerade etwas erstaunt und wollte mal fragen, wo im c oder c++ 
Standard definiert ist, dass folgender Code ausgeführt wird.
1
#include <stdio.h>
2
3
int main() {
4
    
5
    for(int x = 0; x <= 11; x++) {
6
        switch(x) {
7
            case 1 ... 5: printf("%d\n",x); break;
8
            case 6 ... 10: printf("%d\n",x); break;
9
            default: printf("Wert nicht im Range!\n"); break;
10
        }
11
    }
12
    
13
    return 0;
14
}

Getestet auf https://www.onlinegdb.com/

Bisher war mein Kenntnisstand, dass man nur auf einen Wert testen kann.

Danke und Gruß
Jörg

von Oliver S. (oliverso)


Lesenswert?

Das ist eine gcc-eigene Erweiterung, die nicht im Standard steht.

Oliver

von Jörg (Gast)


Lesenswert?

Hallo Oliver,

danke für den Hinweis.

Heißt für mich garnicht erst dran gewöhnen. :-)

Gruß Jörg

von Olaf (Gast)


Lesenswert?

> Das ist eine gcc-eigene Erweiterung, die nicht im Standard steht.

Kannte ich noch garnicht. Sieht aber cool aus. Gleich mal angewoehnen. 
:-D

Olaf

von Ingo Less (Gast)


Lesenswert?

Jörg schrieb:
> Heißt für mich garnicht erst dran gewöhnen. :-)

Olaf schrieb:
> Gleich mal angewoehnen.

So unterschiedlich sind die Meinungen ;)

von Peter D. (peda)


Lesenswert?

Kommt drauf an, ob man den GCC benutzen kann oder was anderes benutzen 
muß.
Ist auf jeden Fall deutlich besser lesbar, als endlos verschachtelte 
if/else Ketten.

von Jürgen (Gast)


Lesenswert?

Hallo,

der Syntax ist an Pascal angelehnt. Ohne den "dritten" Punkt.

In C macht man(n) das eigentlich so:

switch(x){
   case 1 :
   case 2 :
   case 3 :
   case 5 : {
        tue irgendetwas
        return
   }
   case 7 :

usw. und so fort.

C Buch lesen.

Caio

von Rolf M. (rmagnus)


Lesenswert?

Jörg schrieb:
> Hallo Oliver,
>
> danke für den Hinweis.
>
> Heißt für mich garnicht erst dran gewöhnen. :-)

Wenn man gcc in den Standard-Modus versetzt (z.B. -std=c11), bricht er 
erstaunlicherweise nicht mit einem Fehler ab. Er gibt nicht mal eine 
Warnung aus. Erst wenn man zusätzlich noch -pedantic angibt, warnt er 
wenigstens.
1
$ gcc rangecase.c -std=c11 -pedantic
2
rangecase.c: In function ‘main’:
3
rangecase.c:7:13: warning: range expressions in switch statements are non-standard [-Wpedantic]
4
             case 1 ... 5: printf("%d\n",x); break;
5
             ^~~~
6
rangecase.c:8:13: warning: range expressions in switch statements are non-standard [-Wpedantic]
7
             case 6 ... 10: printf("%d\n",x); break;
8
             ^~~~

von Michael F. (Gast)


Lesenswert?

Rolf M. schrieb:
> Wenn man gcc in den Standard-Modus versetzt (z.B. -std=c11), bricht er
> erstaunlicherweise nicht mit einem Fehler ab. Er gibt nicht mal eine
> Warnung aus.

Bedeutet diese Option wirklich, dass gcc den Standard strikt befolgen 
soll oder legst Du nur fest, dass als Dialekt C11 (inklusive gcc 
spezifischer Erweiterungen) ok ist?

von Programmierer (Gast)


Lesenswert?

Michael F. schrieb:
> Bedeutet diese Option wirklich, dass gcc den Standard strikt befolgen
> soll

Ja.

Michael F. schrieb:
> oder legst Du nur fest, dass als Dialekt C11 (inklusive gcc spezifischer
> Erweiterungen) ok ist?

Nein, das wäre -std=gnu11

Rolf M. schrieb:
> Er gibt nicht mal eine Warnung aus. Erst wenn man zusätzlich noch
> -pedantic angibt, warnt er wenigstens.

Wie ist das bei -Wall -Wextra ? Sollte man eh immer nutzen...

Olaf schrieb:
> Sieht aber cool aus. Gleich mal angewoehnen. :-D

Nur weil etwas cool aussieht ist das nicht sofort sinnvoll... erst recht 
wenn es nicht Standard konform ist und nur mit dem GCC geht...

von Rolf M. (rmagnus)


Lesenswert?

Programmierer schrieb:
> Rolf M. schrieb:
>> Er gibt nicht mal eine Warnung aus. Erst wenn man zusätzlich noch
>> -pedantic angibt, warnt er wenigstens.
>
> Wie ist das bei -Wall -Wextra ?

Nichts…
Wenn das mit Fehler abbrechen soll, muss ich -Werror=pedantic angeben.

> Sollte man eh immer nutzen...

Tue ich auch immer.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.