Domanda

    

Questa domanda ha già una risposta qui:

         

Ho visto alcune risposte a questo problema e lo capisco: non puoi dichiarare e assegnare variabili all'interno di un switch . Ma mi chiedo se quanto segue è corretto nel lanciare un errore che dice

  

errore: espressione prevista prima di 'int'

Codice:

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

Perché mettere una chiamata a NSLog () prima che non comporti errori?

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

Soluzione

In realtà puoi dichiarare le variabili all'interno di uno switch se lo fai in base alla sintassi della lingua. Viene visualizzato un errore perché " case 0: " è un'etichetta e in C è illegale avere una dichiarazione come prima dichiarazione dopo un'etichetta & # 8212; si noti che il compilatore si aspetta un'espressione , come una chiamata di metodo, un'assegnazione normale, ecc. (Per quanto bizzarro possa essere, questa è la regola.)

Quando hai inserito NSLog () per primo, hai evitato questa limitazione. È possibile racchiudere il contenuto di un caso tra parentesi graffe {} per introdurre un blocco di scoping oppure spostare la dichiarazione della variabile all'esterno dell'interruttore. Quale scegli è una questione di preferenze personali. Basta essere consapevoli del fatto che una variabile dichiarata tra parentesi graffe {} è valida solo all'interno di tale ambito, quindi anche qualsiasi altro codice che la utilizza deve apparire all'interno di tali parentesi graffe.


Modifica

A proposito, questa stranezza non è così rara come potresti pensare. In C e Java, è anche illegale utilizzare una dichiarazione di variabile locale come istruzione solitaria (che significa " non racchiusa tra parentesi graffe) in per , mentre o esegui il ciclo o anche nelle clausole se e altro . (In effetti, questo è coperto nel puzzle # 55 di " Java Puzzlers " , che consiglio vivamente.) Penso che generalmente non scriviamo tali errori per cominciare perché ha poco senso dichiarare una variabile come l'unica affermazione in tali contesti. Con i costrutti switch / case , tuttavia, alcune persone omettono le parentesi graffe poiché l'istruzione break è l'istruzione critica per il flusso di controllo.

Per vedere come si adatta il compilatore, copia questo frammento orribile e inutile nel tuo codice (Obiettivo-) C:

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);

Ancora un altro motivo per usare sempre le parentesi graffe {} per delimitare il corpo di tali costrutti. : -)

Altri suggerimenti

Ho riscontrato questo problema in precedenza e la conclusione è stata che hai inserito il codice in un blocco.

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

Un'altra semplice soluzione che uso è aggiungere un'espressione vuota (punto e virgola) prima della dichiarazione. Questo evita di limitare l'ambito variabile a un blocco di codice (o di avere alcune istruzioni case con blocchi di codice e alcune senza).

switch (i) {
    case 0:;
        int j = 1;
        break;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top