2011-09-30 13 views
9

Mi scuso per questa domanda troppo semplicistico, ma io non riesco a capire questo esempio nel libro che sto leggendo:Qualcuno può spiegare questo frammento (perché queste parentesi qui)?

void f5() 
{ 
    int x; 
    { 
     int y; 
    } 
} 

Quali sono le parentesi circostanti int y per? Puoi mettere le parentesi ovunque tu voglia? Se sì, quando e perché lo faresti o è solo un errore nel libro?

+2

Questa è una tecnica, applicata principalmente nel linguaggio C, per la creazione di valori temporanei locali dopo la prima istruzione. Quando l'esecuzione esce dalla parentesi graffa finale, tutte le variabili create all'interno di quell'ambito scompaiono. –

risposta

13

Le parentesi graffe del genere indicano che il codice all'interno delle parentesi graffe è ora in un ambito diverso. Se hai provato ad accedere a y al di fuori delle parentesi graffe, riceverai un errore.

+0

Questo ha senso, ma quello che mi confonde è che pensavo che avrebbe dovuto essere all'interno di una funzione. Se riesci a posizionare le parentesi graffe all'interno di una funzione, non riesco a capire perché dovresti mai usare una funzione nidificata - O sono nel campo sinistro da qualche parte? – Gary

+4

Una funzione ha il proprio ambito, ma è anche possibile avere scope all'interno di una funzione. Questo può essere molto utile, ad esempio gli oggetti C++ hanno distruttori e questi possono essere usati per liberare risorse in un punto particolare quando l'oggetto esce dall'ambito. Potresti voler fare questa funzione intermedia. – Benj

4

Definisce lo scopo. La variabile Y non è accessibile al di fuori delle parentesi graffe.

4

Le parentesi indicano lo scope, la variabile x sarà visibile nell'ambito della parentesi graffa interna, ma y non sarà visibile al di fuori dell'ambito del controvento.

3

Le parentesi definiscono un livello di ambito. Al di fuori delle parentesi graffe, non sarà disponibile.

1

Che assomiglia a un errore (non conoscendo il contesto)

Facendo che si è inscatolato il valore y dentro quei parentesi graffe, e come tale non è disponibile al di fuori di esso.

Naturalmente, se si sta cercando di spiegare la portata, che potrebbe essere un codice valido

6

E 'una questione di variabili di ambito, ad esempio:

void f5() 
{ 
    int x = 1; 
    { 
     int y = 3; 
     y = y + x;   // works 
     x = x + y;   // works 
    } 
    y = y + x;    // fails 
    x = x + y;    // fails 
} 
3

All'uscita ambito gli oggetti interni sono distrutti . È possibile, ad esempio, racchiudere una sezione critica in parentesi graffe e costruire lì un oggetto di blocco. Quindi non devi preoccuparti di dimenticare di sbloccarlo - il distruttore viene chiamato automaticamente quando si esce dall'oscilloscopio - normalmente o a causa di un'eccezione.

Problemi correlati