Qual è lo scopo di un ciclo “while” e “for”?

Qual è lo scopo di un ciclo while e for ?

Ad esempio, se ho dichiarato un object all’interno del ciclo, qual è il suo comportamento e perché?

Negli esempi seguenti tutte le variabili vengono distrutte e ricreate per ogni iterazione del ciclo tranne i , che persiste tra iterazioni di loop ed è disponibile per le espressioni condizionali e finali nel ciclo for. Nessuna delle variabili è disponibile al di fuori dei loop. La distruzione delle variabili all’interno del corpo del ciclo for si verifica prima che i sia incrementato.

 while(int a = foo()) { int b = a+1; } for(int i=0; i<10; // conditional expression has access to i ++i) // final expression has access to i { int j = 2*i; } 

Per quanto riguarda il perché; i loop effettivamente prendono una singola istruzione per il loro corpo, succede solo che c'è una dichiarazione chiamata istruzione composta creata da parentesi graffe. L'ambito delle variabili create in qualsiasi istruzione composta è limitato all'istruzione composta stessa. Quindi questa non è una regola speciale per i loop.

I cicli e le istruzioni di selezione hanno le proprie regole per le variabili create come parte dell'istruzione loop o selezione stessa. Questi sono solo progettati in base a ciò che il designer ritiene sia più utile.

Qualunque cosa dichiarata nel ciclo è circoscritta a quel ciclo e non è ansible accedere al di fuori delle parentesi graffe. In realtà, non è nemmeno necessario un ciclo per creare un nuovo ambito. Puoi fare qualcosa come:

 { int x = 1; } //x cannot be accessed here. 
 int d; // can use d before the loop for(int a = 0; a < 5; ++a) // can use a or d in the () { int b; // can use d, a, b in the {} } int c; // can use d, c after the loop 

b sono visibili solo nell'ambito del ciclo for. L'ambito include cosa c'è nel ciclo () e {}

Ho pensato che valesse la pena di menzionare:

Alcuni compilatori possono avere un’opzione che influenza l’ambito delle variabili create all’interno dell’inizializzatore del ciclo for. Ad esempio, Microsoft Visual Studio ha un’opzione / Zc: forScope (Force Conformance in for Loop Scope). Il valore predefinito è il comportamento standard di c ++. Tuttavia, questo può essere modificato in modo che la variabile di ciclo for venga mantenuta in vita al di fuori dell’ambito del ciclo for. Se si utilizza VS, potrebbe essere utile essere consapevoli del fatto che questa opzione esiste in modo da poter assicurarsi che il suo set per il comportamento desiderato. Non sono sicuro se ci sono altri compilatori che hanno questa opzione.

Alcuni compilatori potrebbero eliminare il codice che ritiene inutile, a causa delle impostazioni di ottimizzazione e dell’eliminazione di ” Dead Store “. Ad esempio, se la variabile che si sta modificando all’interno del ciclo non viene letta da nessuna parte al di fuori del ciclo, il ciclo stesso potrebbe essere scartato dal compilatore.

Ad esempio, considera il seguente ciclo:

 int cnt = 0; int trys = MAX_INT; while (trys-- > 0) { cnt += trys; } 

è ansible che alcuni compilatori possano scartare [il contenuto di] il ciclo, perché la variabile Cnt non viene utilizzata dopo il ciclo.

Volevo solo aggiungere che le variabili dichiarate nel ciclo for o while sono anch’esse con scope all’interno del ciclo. Per esempio:

 for (int index = 0; index < SOME_MAX; ++index) { ... } // index is out of scope here. 
 int a; for(int b=0; b<10; ++b) { int c; } 

ambiti come se fosse:

 int a; { int b=0; begin: if (b<= 10) { { int c; } ++b; goto begin; } } 

Lo scopo è che le variabili vadano fuori dal campo di applicazione in punti di sequenza chiaramente definiti.

 for( int i = 0; i < 10; ++i ) { string f = "foo"; cout << f << "\n"; } // i and f are both "gone" now 

Nel suddetto codice di esempio, sia i che f hanno scope all'interno di { {e } } Quando viene eseguita la parentesi di chiusura, entrambe le variabili non rientrano nello scope.

La ragione di ciò è semplicemente che lo Standard dice così; è così che funziona il linguaggio C ++.

Per quanto riguarda la motivazione , considera che questo può essere usato a tuo vantaggio:

 for( ...) { std::auto_ptr obj(new SomeExpensiveObject); } 

Nel codice precedente, stiamo usando un puntatore intelligente RAII per "possedere" l'object costoso che abbiamo creato all'interno del ciclo. La semantica di scoping del ciclo for impone che dopo ogni esecuzione del ciclo, l'object che è stato creato durante quell'iterazione verrà distrutto.

Dai un’occhiata a questo codice

 #include < stdio.h > int i = 10; int main() { for(int i=0; i<3; i++) { fprintf(stdout," for i = %d & upper i = %d\n",i,::i); } while (i>3) { int i = 30; fprintf(stdout," while i = %d & upper i = %d\n",i,::i); i++; fprintf(stdout," while i = %d & upper i = %d\n",i,::i); } fprintf(stdout,"i = %d \n",i); } 

Nel codice sopra, la variabile globale i è diversa da quella che controlla il ciclo for.

Stamperà

 for i = 0 & upper i = 10 for i = 1 & upper i = 10 for i = 2 & upper i = 10 

quando viene eseguito il ciclo while – la variabile che ho definito all’interno mentre sta avendo scope locale, dove la variabile sotto (i> 3) segue la variabile globale e non si riferisce all’ambito locale.

Dipan.

In C / C ++, l’ambito di una variabile dichiarata in un ciclo for o while (o qualsiasi altro blocco tra parentesi, per quella materia) è dalla parentesi aperta alla parentesi chiusa.

 while (some_condition == true) { int myVar = 3; } cout << myVar << endl; // This will cause a compilation error 

La variabile rientra nell’ambito del ciclo. Vale a dire che devi essere all’interno del ciclo per accedervi. È lo stesso che se hai dichiarato una variabile all’interno di una funzione, solo le cose nella funzione hanno accesso ad essa.