Dichiarazione di variabili all'interno di un'istruzione switch [duplicato]
-
22-07-2019 - |
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;
}
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;
}