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 :-)
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.