In (Objective-) C (++) le dichiarazioni while(...) { ... }
, for(...) { ... }
, switch(...) { ...}
ecc contengono una singola istruzione blocco (if (...) { ... } else { ... }
contiene due). L'ambito delle dichiarazioni all'interno di un blocco è solo quel blocco ed è un errore dichiarare la stessa variabile due volte all'interno di un blocco.
Il blocco di un switch
contiene un certo numero di etichette case ...:
- etichette non delimitano blocchi, sono solo punti all'interno di un blocco che controllano il flusso può saltare. Ciò rende le istruzioni switch
in C diverse da quelle in altre lingue in cui ogni ramo è indipendente (poiché i due blocchi in un if/else
sono indipendenti in C). A C switch
è solo un "goto calcolato" in un singolo blocco. Ecco perché esiste l'istruzione break;
, senza che il flusso di controllo continui da un "ramo" all'altro.
Un'altra conseguenza di questo è che rami diversi non possono dichiarare gli stessi nomi di variabili, diversamente dalle istruzioni if/else
.
Infine solo dichiarazioni e non dichiarazioni possono essere etichettati, e come case ...:
è una forma di etichetta non ci può essere una dichiarazione subito dopo uno - quindi non è possibile avviare una "succursale" con una dichiarazione.
Se le variabili che si desidera dichiarare all'interno di un ramo devono essere utilizzate solo in quel ramo (come lo sarebbero se dichiarato in uno dei blocchi di un if/else
), allora è possibile risolvere tutti i problemi racchiudendo il ramo tra parentesi graffe , { ... }
, per trasformarlo in un'istruzione di blocco - i blocchi possono essere etichettati e possono contenere dichiarazioni locali. Per esempio. qualcosa sulla falsariga di:
switch (expr)
{
case 1:
{
NSString *var;
// use var
break;
}
case 2:
{
NSNumber *var;
// use var
break;
}
...
}
// no var here
Se si assegnano alle variabili che è necessario utilizzare dopo la switch
poi li si deve dichiarare prima del switch
, come il corpo di un switch
è un blocco e, quindi, una dichiarazione locale scopo. Per esempio. qualcosa sulla falsariga di:
NSString *var = nil;
switch (expr)
{
case 1:
...
var = ...;
break;
case 2:
...
var = ...;
break;
...
}
// use var here
HTH
Tutte le dichiarazioni di tutti i casi di un'istruzione switch sono nello stesso campo di applicazione, in modo che quando si dichiara una variabile con un nome in un caso, e poi si dichiara una variabile con lo stesso nome in un caso diverso, stai effettivamente facendo la dichiarazione due volte. L'errore non è nell'assegnazione o nella definizione, è nella dichiarazione. O si usano le parentesi graffe per creare un nuovo ambito in ciascun caso, o si dichiara semplicemente la variabile una volta, prima del 'cambio', e si rinvia l'assegnazione fino al' caso'. – iluvcapra