122 Stimmen

Deklaration von Variablen innerhalb einer switch-Anweisung

Ich habe einige Antworten auf dieses Problem gesehen, und ich verstehe es - man kann keine Variablen innerhalb einer Datei deklarieren und zuweisen switch . Aber ich frage mich, ob die folgende Fehlermeldung korrekt ist

Fehler: erwarteter Ausdruck vor 'int'

Code:

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

Warum sollte ein Anruf bei NSLog() bevor es zu keinen Fehlern führt?

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

1 Stimmen

Diese Frage wurde bereits (mindestens) zweimal gestellt: stackoverflow.com/questions/92396/ stackoverflow.com/questions/1115304/

2 Stimmen

Das stimmt, aber beide Fragen sind noch offen. Ich sehe kein Problem darin, diese Frage in Ruhe zu lassen - es ist nicht nötig, für ihre Schließung zu stimmen...

1 Stimmen

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.

149voto

Quinn Taylor Punkte 44113

Sie haben tatsächlich puede Variablen innerhalb eines Schalters deklarieren, 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 Erklärung als erste Anweisung nach einem Label - beachten Sie, dass der Compiler eine Ausdruck wie z. B. ein Methodenaufruf, eine normale Zuweisung usw. (So bizarr es auch sein mag, das ist die Regel.)

Wenn Sie NSLog() vorangestellt haben, konnten Sie diese Einschränkung vermeiden. Sie können den Inhalt eines Cases in geschweifte Klammern { } einschließen, um einen Scoping-Block einzuführen, oder Sie können die Variablendeklaration außerhalb des Schalters verschieben. Was Sie wählen, ist eine Frage der persönlichen Vorliebe. Beachten Sie jedoch, dass eine in { } geschweiften Klammern deklarierte Variable nur innerhalb dieses Bereichs gültig ist, so dass jeder andere Code, der sie verwendet, ebenfalls innerhalb dieser Klammern stehen 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 (d.h. nicht von geschweiften Klammern umgeben) in einer für , während ou faire Schleife, oder sogar in si y sinon Klauseln. (Tatsächlich wird dies in Rätsel Nr. 55 von "Java-Rätsel" die ich sehr empfehle). Ich denke, wir schreiben solche Fehler in der Regel gar nicht erst, weil es wenig Sinn macht, eine Variable als einzige Anweisung in solchen Zusammenhängen zu deklarieren. Mit Schalter / Fall Konstrukte, allerdings lassen manche Leute die geschweiften Klammern weg, da die Pause Anweisung ist die entscheidende Anweisung für den Kontrollfluss.

Um zu sehen, wie der Compiler ausrastet, kopieren Sie diesen schrecklichen, sinnlosen Ausschnitt 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 Grund mehr, den Textkörper solcher Konstrukte immer mit { } Klammern abzugrenzen :-)

0 Stimmen

Wow, das ist seltsam... aber danke!

9 Stimmen

Wenn die Variable nur in einem einzigen Fall verwendet wird, ist es im Allgemeinen besser, den Fallabschnitt in { } einzuschließen (so wird verhindert, dass die Variable später versehentlich wieder verwendet wird). Wenn die Variable später wieder verwendet wird, ist es wirklich sinnvoller, sie vor dem Beginn der switch-Anweisung zu deklarieren, da es sonst sehr umständlich ist.

0 Stimmen

Ich stimme völlig zu, die Verwendung eines verschachtelten Bereichs mit geschweiften Klammern macht die Absicht kristallklar und kann zufällige Fehler verhindern. Danke für die Klarstellung!

51voto

newacct Punkte 114757

Ich habe dieses Problem schon einmal gehabt, und die Schlussfolgerung war, dass man den Code einfach in einen Block einfügt.

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

4voto

Joel Punkte 14494

Eine weitere einfache Abhilfe besteht darin, der Deklaration einen leeren Ausdruck (Semikolon) voranzustellen. Dadurch wird vermieden, dass der Geltungsbereich der Variablen auf einen Codeblock beschränkt wird (oder dass einige Fallanweisungen mit Codeblöcken und einige ohne Codeblöcke vorhanden sind).

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

0 Stimmen

Dies führt zu einer Fehlermeldung in meinem default Fall: Switch case is in protected scope.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X