mikrocontroller.net

Forum: Compiler & IDEs Wertebereich in switch / case Anweisung


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Jörg (Gast)


Bewertung
0 lesenswert
nicht 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.
#include <stdio.h>

int main() {
    
    for(int x = 0; x <= 11; x++) {
        switch(x) {
            case 1 ... 5: printf("%d\n",x); break;
            case 6 ... 10: printf("%d\n",x); break;
            default: printf("Wert nicht im Range!\n"); break;
        }
    }
    
    return 0;
}

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)


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

Oliver

von Jörg (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Hallo Oliver,

danke für den Hinweis.

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

Gruß Jörg

von Olaf (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
2 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.
$ gcc rangecase.c -std=c11 -pedantic
rangecase.c: In function ‘main’:
rangecase.c:7:13: warning: range expressions in switch statements are non-standard [-Wpedantic]
             case 1 ... 5: printf("%d\n",x); break;
             ^~~~
rangecase.c:8:13: warning: range expressions in switch statements are non-standard [-Wpedantic]
             case 6 ... 10: printf("%d\n",x); break;
             ^~~~

von Michael F. (michaelfu)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.