Was bedeutet der Kommaoperator in einer switch-Anweisung?

Lesezeit: 5 Minuten

Benutzer-Avatar
Tushar Bharadwaj

Mir wurde eine Frage gestellt und ich wurde gebeten, die Ausgabe zu geben.

int main(void){  
    int x = 2;  
    switch(x){  
        case 1,2,1: printf("Case 1 is executed");  
            break;  
        case 2,3,1: printf("Case 2 is executed");  
            break;  
        default : printf("Default case us executed");  
    }  
    return 0;  
}

Der obige Code gibt in Turbo C die Ausgabe „Fall 1 wird ausgeführt“ aus, aber bei Codeblocks und online kompilieren gibt es einen Compilerfehler.

Was ist richtig? Ist es ein Compilerfehler oder nicht? Und wenn nicht, warum läuft der Code nur auf Turbo C?

  • Das sieht bizarr aus. Ich habe das Gefühl, dass Turbo C diese Fälle wahrscheinlich zuerst auswertet Komma-Operator

    – Wut D

    19. Oktober 2013 um 14:06 Uhr


  • @RageD Das würde es auch nicht erklären: beides 1,2,1 und 2,3,1 normalerweise mit dem gleichen Wert bewerten, also würde ich still Erwarten Sie, dass Turbo C einen Compilerfehler ausgibt, wenn dies der Grund ist.

    Benutzer743382

    19. Oktober 2013 um 14:08 Uhr

  • @hvd Guter Punkt – auf jeden Fall ist es immer noch mehrdeutig. Auch in den folgenden Antworten sollte dies nicht zulässig sein, da die Fallaufzählung immer noch Duplikate liefern würde.

    – Wut D

    19. Oktober 2013 um 14:11 Uhr


  • Mein Compiler macht genau das, was RageD angegeben hat. Es wertet nur die 1 in 1,2,1 aus und beschwert sich dann, dass es keinen Doppelpunkt (:) nach dieser Zahl gesehen hat.

    – Jason Henochs

    19. Oktober 2013 um 14:15 Uhr

  • Tests mit Turbo C++ 3.0 zeigen, dass es einen Compilerfehler gibt: imgur.com/KsIy2ja

    Benutzer743382

    19. Oktober 2013 um 14:25 Uhr

Benutzer-Avatar
Mike Seymour

ist es ein Compilerfehler oder nicht.

Der Code ist in beiden Sprachen ungültig: die case expression muss ein konstanter Ausdruck sein, und ein konstanter Ausdruck darf keinen Kommaoperator enthalten. (In C wird dies ausdrücklich angegeben; in C++ müssen Sie die Grammatik aufheben, um zu finden, dass a konstanter Ausdruck muss ein sein bedingter Ausdruckdie kein Komma enthalten darf).

Auch wenn Sie hier den Komma-Operator verwenden dürften, die switch -Anweisung wäre immer noch ungültig, da zwei Fälle beide denselben Wert haben würden, 1.

Und wenn nicht, warum läuft der Code nur auf Turbo C.

Weil sich beide Sprachen seit der letzten Aktualisierung dieses prähistorischen Compilers erheblich verändert haben. Verwenden Sie es nicht, wenn Sie Varianten von C oder C++ aus diesem Jahrhundert lernen möchten.

  • Stimmen Sie @Mike zu – Wenn Sie Code::Blocks verwenden, ist minGW ein gut gepflegter Open-Source-Compiler, der kostenlos zur Verfügung steht. Es wäre eine bessere Wahl als Turbo C.

    – ryker

    19. Oktober 2013 um 14:32 Uhr

  • Die einzige Variante der C-Form in diesem Jahrhundert ist C11. Nicht alle “modernen” Compiler unterstützen sogar C99.

    – Keith Thompson

    19. Oktober 2013 um 18:16 Uhr

  • Um einen Kommentar zu einer anderen Turbo-C-Frage zu zitieren: Nehmen Sie den Hinweis, verwenden Sie gcc.

    – Gerrit

    19. Oktober 2013 um 20:03 Uhr

  • @KeithThompson: Entschuldigung, ich vergesse immer wieder, nicht sarkastisch zu sein, wenn die Frage mit “C” gekennzeichnet ist.

    – Mike Seymour

    19. Oktober 2013 um 23:18 Uhr

  • Compiler dürfen Erweiterungen implementieren, die sich nicht auf konforme Programme auswirken, und jeder Compiler tut dies; Die Tatsache, dass Turbo C dies zulässt, sollte also nicht als Geringschätzung von Turbo C angesehen werden

    – MM

    11. November 2014 um 21:18 Uhr

Benutzer-Avatar
ryyker

Was bedeutet der Kommaoperator in einer switch-Anweisung?

Es bedeutet, dass Sie einen alten Compiler haben.

Bearbeiten posten (zeigen case range Beispiel)

Die ersten beiden Beispiele (einschließlich Ihres ursprünglichen Codes) weisen eine falsche switch-Anweisungssyntax (mit Erläuterungen) auf. Das dritte Codebeispiel zeigt, wie das Stapeln von Kartonetiketten korrekt durchgeführt wird:

In Ihrem Code sollte der Compiler das erste Komma danach gekennzeichnet haben case 1,<-- hier

#include <ansi_c.h>
int main(void){  
    int x = 2;  
    switch(x)
    {  
        case 1,2,1: printf("Case 1 is executed");  
        break;  //error flagged at first comma, and all comma after in case
        case 2,3,1: printf("Case 2 is executed");  
        break;  
        default : printf("Default case is executed");  
    }  
    return 0;  
}  

Und selbst wenn Sie so modifiziert werden, sollten Sie auch einen doppelten Etikettenfehler erhalten:

#include <ansi_c.h>
int main(void){  
    int x = 2;  
    switch(x)
    {  
        case 1:
        case 2:
        case 1: printf("Case 1 is executed"); //duplicate label 1 error. (and others below) 
            break;  
        case 2:
        case 3:
        case 1: printf("Case 2 is executed");  
            break;

        default : printf("Default case is executed");  
    }
    return 0;  
}

Dieses Beispiel ist vollkommen legal (C99, C11) und nützlich: dh es gibt keine doppelten Labels, und die Syntax entspricht der korrekten Verwendung von Schaltern durch Stapeln einzigartig Etiketten, um Bedingungen zu behandeln, wo case 1: OR case 2: OR case 3: sollten auf die gleiche Weise behandelt werden (im selben Block). Und das gilt natürlich auch für die Fälle 4, 5 und 6.

#include <ansi_c.h>
int main(void){  
    int x = 2;  
    switch(x)
    {  
        case 1:
        case 2:
        case 3: printf("Case 1,2 or 3 is executed"); //duplicate label 1 error. (and others below) 
            break;  
        case 4:
        case 5:
        case 6: printf("Case 4,5 or 6 is executed");  
            break;
    }
    getchar();
    return 0;  
}

Dieses letzte Beispiel ist nur der Vollständigkeit halber enthalten. Es veranschaulicht die case range Ausdruck. Obwohl es bei C-Programmierern auf Interesse stößt, ist es noch kein Teil von C99 oder C11, sondern eine Erweiterung von C99 Sonne (ein Unix-Geschmack) und GNU-C-Compiler (ua):

...
    switch(x)
    {  
            case 'a' ... 'z':  //note: spaces between all characters ('a') and ellipses are required
                    printf("lowercase alpha char detected");
                    break;
            case 'A' ... 'B':
                    printf("uppercase alpha char detected");
                    break;

            default: printf("Default case is executed");  
    }
...

Der Grund für die mehrdeutigen Ergebnisse, die Sie von einem Compiler zum anderen sehen, kann sein, dass Turbo C wirklich ist Ja wirklich alt. Die von Ihnen verwendete Version wurde wahrscheinlich gegen eine Version der C-Standards implementiert, die nicht mehr aktuell ist.

Erwägen Sie den Wechsel zu einem aktuellen Compiler. Eine preiswerte (kostenlose) Alternative ist MinGW. MinGW ist ein sehr gepflegter Open-Source-Compiler. Wenn Sie gerne integrierte Entwicklungsumgebungen (IDE) verwenden, Code::Blöcke ist eine Option, ebenfalls kostenlos, und wird als Option mit MinGW gebündelt geliefert.

Suchen Sie in Bezug auf die Kompatibilität nach Vergleich mit anderen Compiler-Suiten in diesem Link, um mehr über MinGW-Erweiterungen zu erfahren. MinGW-Erweiterungen erweitern zwar die Möglichkeiten, machen aber manchmal Code, der mit ihnen geschrieben wurde, nicht mit anderen portierbar aktuell Compiler. Es wird empfohlen, bei der Verwendung Vorsicht walten zu lassen.

Benutzer-Avatar
Kumareshan

Turbo C verwendet den Komma-Operator bei Switch-Fällen und nimmt den letzten Wert, zum Beispiel Fall 1, 2, 3: wird als Fall 3 kompiliert: Fall 2, 3, 1 als Fall 1: Daher gibt Turbo C keinen Fehler aus. Wo andere Compiler Fall 1, 2, 3 nicht zulassen: Art der Anweisung selbst.

Aber in Ihrem Fall gibt sogar Turbo c einen Fehler aus, weil Case-Anweisungen so etwas wie Case 1, 2, 1: und Case 3, 2, 1: sind, die als Case 1: und Case 1: daher gemäß den Switch-Case-Regeln erfüllt werden Sie können nur 1 Fall mit einem Wert haben und Sie können den Fall nicht wiederholen

Ich bevorzuge den gcc-Compiler statt Turbo C

Benutzer-Avatar
Lolando

Sie können nicht zweimal denselben ‘Case’-Wert verwenden
Das ist nicht richtig: case 1: case 2: case 1: printf("Case 1 is executed");

Versucht, auf VS2010 zu kompilieren => (Fehler C2196: Fallwert ‘1’ bereits verwendet)

Benutzer-Avatar
hackt

ist es ein Compilerfehler oder nicht.

Es wird einen Kompilierungsfehler verursachen (weiß nicht darüber TURBO-C++ aber in modernen Compilern).
So funktioniert die switch-Anweisung nicht (ungültige Syntax in c/c++). Sie können a nicht wiederverwenden case Wert ein switch Erklärung (siehe die Verknüpfung gegeben von chris) Die Art und Weise, wie Sie dies tun können;

 switch(x){
            case 1: case 2: case 3: printf("Case 1 is executed");
            break;
            default : printf("Default case us execyted"); 
          }

  • @chris; Hoppla! Ich habe das vergessen.

    – Hacken

    19. Oktober 2013 um 14:13 Uhr

  • @hackks Aber du beantwortest die Frage immer noch nicht.

    – Grijesh Chauhan

    19. Oktober 2013 um 14:18 Uhr

  • @hackks – Ich gehöre nicht zu den Downvotern, aber können Sie das in Ihrer Aussage sehen? It is not a compiler error but it will cause a compilation error könnte für eine Person, die noch nicht mit dem Debugging-Jargon vertraut ist, verwirrend sein? Biete nur eine Möglichkeit an warum

    – ryker

    19. Oktober 2013 um 14:38 Uhr

  • @ryyker; :). Ja. Ich merke jetzt. Ich denke, es ist besser, diese Zeile zu entfernen.

    – Hacken

    19. Oktober 2013 um 14:40 Uhr

  • @downvoter; Es ist eine sehr schlechte Praxis, die Ablehnung nicht zu entfernen, nachdem die Antwort bearbeitet (korrigiert) wurde.

    – Hacken

    19. Oktober 2013 um 15:13 Uhr

Benutzer-Avatar
Gemeinschaft

Zu Ihrer Information, heute kann man die Erweiterung der GCC-Fallbereiche verwenden, wenn es für ähnliche Ergebnisse angemessen ist (was nicht oft der Fall ist) (es werden nur Bereiche unterstützt, keine willkürlichen Wertelisten).

case 1 ... 5:
case 'A' ... 'Z':

  • @chris; Hoppla! Ich habe das vergessen.

    – Hacken

    19. Oktober 2013 um 14:13 Uhr

  • @hackks Aber du beantwortest die Frage immer noch nicht.

    – Grijesh Chauhan

    19. Oktober 2013 um 14:18 Uhr

  • @hackks – Ich gehöre nicht zu den Downvotern, aber können Sie das in Ihrer Aussage sehen? It is not a compiler error but it will cause a compilation error könnte für eine Person, die noch nicht mit dem Debugging-Jargon vertraut ist, verwirrend sein? Biete nur eine Möglichkeit an warum

    – ryker

    19. Oktober 2013 um 14:38 Uhr

  • @ryyker; :). Ja. Ich merke jetzt. Ich denke, es ist besser, diese Zeile zu entfernen.

    – Hacken

    19. Oktober 2013 um 14:40 Uhr

  • @downvoter; Es ist eine sehr schlechte Praxis, die Ablehnung nicht zu entfernen, nachdem die Antwort bearbeitet (korrigiert) wurde.

    – Hacken

    19. Oktober 2013 um 15:13 Uhr

1364510cookie-checkWas bedeutet der Kommaoperator in einer switch-Anweisung?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy