Deklarieren von Variablen innerhalb einer switch-Anweisung [duplicate]

Lesezeit: 4 Minuten

Benutzeravatar von dizy
schwindelig

Ich habe ein paar Antworten auf dieses Problem gesehen, und ich verstehe – Sie können innerhalb von a keine Variablen deklarieren und zuweisen switch. Aber ich frage mich, ob das Folgende richtig ist, wenn es darum geht, einen Fehler zu sagen

Fehler: erwarteter Ausdruck vor ‘int’

Code:

switch (i) {
    case 0:
        int j = 1;
        break;
}

Warum sollte man anrufen NSLog() bevor es zu keinen Fehlern führt?

switch (i) {
    case 0:
        NSLog(@"wtf");
        int j = 1;
        break;
}

  • Dies wurde (mindestens) zweimal zuvor gefragt: stackoverflow.com/questions/92396/… stackoverflow.com/questions/1115304/…

    – Adam Rosenfield

    5. August 2009 um 15:42 Uhr

  • Stimmt, aber beide Fragen sind noch offen. Ich sehe kein Problem darin, dieses in Ruhe zu lassen – keine Notwendigkeit, dafür zu stimmen, es zu schließen …

    – Quinn Taylor

    5. August 2009 um 16:25 Uhr

  • Adam, während der andere Beitrag den Fehler beantwortet, ging er nicht auf die Tatsache ein, dass das Setzen eines Ausdrucks als erster Aufruf den Fehler tatsächlich vermeiden würde. Etwas, das Quinn hier beantwortet hat.

    – schwindelig

    5. August 2009 um 22:20 Uhr

Benutzeravatar von Quinn Taylor
Quinn Taylor

Du eigentlich kann Deklarieren Sie Variablen innerhalb eines Schalters, wenn Sie dies gemäß der Syntax der Sprache tun. Sie erhalten eine Fehlermeldung, weil “case 0:” ist ein Label, und in C ist es illegal, ein zu haben Erklärung als erste Anweisung nach einem Label — beachten Sie, dass der Compiler ein erwartet Ausdruckwie ein Methodenaufruf, eine normale Zuweisung usw. (So bizarr es auch sein mag, das ist die Regel.)

Als Sie NSLog() an die erste Stelle gesetzt haben, haben Sie diese Einschränkung umgangen. Sie können den Inhalt eines case in geschweiften { } Klammern einschließen, um einen Scoping-Block einzuleiten, oder Sie können die Variablendeklaration außerhalb des Schalters verschieben. Welche Sie wählen, ist eine Frage der persönlichen Präferenz. Beachten Sie nur, dass eine in geschweiften Klammern { } deklarierte Variable nur innerhalb dieses Gültigkeitsbereichs gültig ist, sodass jeder andere Code, der sie verwendet, auch in diesen geschweiften Klammern erscheinen muss.


Bearbeiten:

Übrigens ist diese Eigenart gar nicht so ungewöhnlich, wie Sie vielleicht denken. In C und Java ist es auch illegal, eine lokale Variablendeklaration als einzige Anweisung (was “nicht von geschweiften Klammern umgeben” bedeutet) in a zu verwenden zum, währendoder tun Schleife oder sogar in wenn und anders Klauseln. (Tatsächlich wird dies in Rätsel Nr. 55 von behandelt “Java-Puzzler”, was ich sehr empfehle.) Ich denke, wir schreiben solche Fehler im Allgemeinen nicht, weil es in solchen Kontexten wenig Sinn macht, eine Variable als einzige Anweisung zu deklarieren. Mit Schalter / Fall Konstrukte, obwohl einige Leute die geschweiften Klammern weglassen, da die Unterbrechung -Anweisung ist die kritische Anweisung für den Kontrollfluss.

Um zu sehen, wie der Compiler wirft, kopieren Sie dieses schreckliche, sinnlose Snippet in Ihren (Objective-)C-Code:

if (1)
    int i;
else
    int i;
for (int answer = 1; answer <= 42; answer ++)
    int i;
while (1)
    int i;
do
    int i;
while (1);

Ein weiterer Grund, immer { } Klammern zu verwenden, um den Körper solcher Konstrukte zu begrenzen. 🙂

  • Wenn die Variable nur innerhalb des einzelnen Falls verwendet wird, ist es im Allgemeinen besser, den case-Abschnitt in { } einzuschließen (es vermeidet eine spätere versehentliche Wiederverwendung). Wird die Variable später noch einmal verwendet, dann ist es wirklich sinnvoller, sie vor Beginn der switch-Anweisung zu deklarieren, da sie sonst sehr stumpf ist.

    – Peter N. Lewis

    5. August 2009 um 5:28 Uhr

  • Wow, sogar C# hat das Problem. Für den einfachen Code if (true) int i = 0; Ich erhalte die folgende Fehlermeldung in Visual Studio, bevor ich überhaupt kompiliere: Embedded statement cannot be a declaration or labeled statement Toll.

    – mkmurray

    5. August 2009 um 15:47 Uhr

  • Nicht überraschend. Es ist schön, dass der Fehler von C# tatsächlich etwas klarer ist als der gcc-Fehler. Und eigentlich bin ich mir nicht sicher, ob ich es als “Problem” einstufen würde … eher als eine absichtlich verbotene Syntax. Ich würde vermuten, dass sich die meisten C-basierten Sprachen ähnlich verhalten.

    – Quinn Taylor

    5. August 2009 um 16:15 Uhr

  • Ja, ich entschuldige mich. Ich verstehe, warum die Syntax verboten ist, da es sinnlos ist, eine Variable zu deklarieren, die sofort den Gültigkeitsbereich verliert. Ich sage aber noch, dass C# diese hier in Objective-C verbotene Switch-Syntax zulässt. Es sind die anderen Anweisungen (if, else, for, while und do), die diese Fehlermeldung erhalten.

    – mkmurray

    5. August 2009 um 16:21 Uhr

  • Ich habe mich tatsächlich entschieden, darüber zu bloggen und habe sogar die C# Language Spec-Grammatik untersucht: murrayon.net/2009/09/variable-declaration-restrictions.html

    – mkmurray

    24. September 2009 um 14:56 Uhr

Ich bin schon einmal auf dieses Problem gestoßen, und die Schlussfolgerung war, dass Sie den Code einfach in einen Block einfügen.

switch (i) {
case 0:
    {
        int j = 1;
        break;
    }
}

Eine andere einfache Problemumgehung, die ich verwende, besteht darin, vor der Deklaration einen leeren Ausdruck (Semikolon) hinzuzufügen. Dadurch wird vermieden, den Variablenbereich auf einen Codeblock zu beschränken (oder einige Case-Anweisungen mit Codeblöcken und andere ohne zu haben).

switch (i) {
    case 0:;
        int j = 1;
        break;
}

  • Dies gibt mir einen Fehler auf meinem default Fall: Switch case is in protected scope.

    – Zak-Tänze

    4. April 2013 um 7:47 Uhr

1422550cookie-checkDeklarieren von Variablen innerhalb einer switch-Anweisung [duplicate]

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

Privacy policy