Frage

    

Diese Frage bereits eine Antwort hier:

         

sah ich ein paar Antworten auf diese Frage, und ich es - Sie nicht erklären können und Variablen innerhalb einer switch zuweisen. Aber ich frage mich, wenn folgendes zu werfen einen Fehler richtig zu sagen

  

Fehler: erwartete Ausdruck vor 'int'

Code:

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

Warum soll einen Anruf setzen NSLog(), bevor es zu keinen Fehlern führen?

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

Lösung

Sie eigentlich kann in einem switch Variablen deklarieren, wenn Sie es tun, nach der Syntax der Sprache. Sie erhält eine Fehlermeldung, weil „case 0:“ ein Etikett ist, und in C ist es illegal, eine Erklärung als erste Anweisung nach einem Label zu haben - beachten Sie, dass der Compiler einen Ausdruck erwartet , wie ein Methodenaufruf, normale Zuordnung usw. (Bizarre obwohl es, das ist die Regel sein.)

Wenn Sie die NSLog () die erste Stelle setzen, vermied man diese Einschränkung. Sie können den Inhalt eines Falles, in {} einschließen Zahnspange einen Scoping-Block einzuführen, oder Sie können die Variablendeklaration außerhalb des Schalters bewegen. Welche Sie wählen, ist eine Frage des persönlichen Geschmacks. Seien Sie sich bewusst sein, dass eine Variable deklariert in {} Zahnspange in diesem Umfang nur dann gültig ist, so dass jeder andere Code, der es auch innerhalb dieser Klammern erscheinen verwendet, muss.


Edit:

Übrigens ist diese Marotte nicht so ungewöhnlich, wie Sie vielleicht denken. In C und Java, es ist auch illegal eine lokale Variable Erklärung als einzige Anweisung zu verwenden (im Sinne von „nicht in geschweifte Klammern) in einem für , , während oder tun Schleife oder sogar in , wenn und anders Klauseln (in der Tat ist dies in Puzzler bedeckt # 55 von

Andere Tipps

Ich habe vor in dieser Frage laufen, und die Schlussfolgerung war, dass Sie nur den Code innerhalb eines Blocks setzen.

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

Eine weitere einfache Abhilfe, die ich verwende, ist ein leeren Ausdruck (Semikolon) vor der Erklärung hinzuzufügen. Dadurch wird vermieden, zu einem Code-Block des Variable Umfang zu begrenzen (oder einige Fall Aussagen mit Codeblöcken und einige ohne).

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