Benvenuti nell'universo di C++! Per la tua domanda, la risposta si trova in un concetto chiamato "Point of declaration".
>>int x = 1;
>>{ int x = x; } // garbage value of x
Dalla sezione: -3.3.1.1 (C++ Draft Standard) Il punto di dichiarazione per un nome è immediatamente dopo la sua completa dichiaratore e prima della sua inizializzazione (se presente), ad eccezione di quanto indicato di seguito.
int x = 12;
{ int x = x; }
Qui; il 'operator =' è l'inizializzatore. Puoi dire che il punto di dichiarazione per 'x' non è ancora stato raggiunto, quindi il valore di 'x' è indeterminato.
>>int const arr = 3;
>>{ int arr[arr]; } // i am told this is perfectly valid and declares an array of 3 ints !!
Perché? Dalla sezione: -3.3.1.4 (Bozza standard C++) Un nome non locale rimane visibile fino al punto di dichiarazione del nome locale che lo nasconde. Qui il punto di dichiarazione è raggiunto a ';' carattere. vale a dire in modo viene utilizzato il valore visibile precedente di 'arr' = 3.
Inoltre, si potrebbe desiderare di sapere che vale quanto segue: -
const int e = 2;
{ enum { e = e }; } // enum e = 2
Dalla sezione: -Capitolo-3.3.1.4 (C++ Standard Draft): - Il punto di dichiarazione per un enumeratore è immediatamente successivo alla definizione del suo enumeratore.
Ma, non farlo
const int Spades = 1, Clubs = 2, Hearts = 3, Diamonds = 4;
enum Suits
{
Spades = Spades, // error
Clubs, // error
Hearts, // error
Diamonds // error
};
Perché? Poiché gli enumeratori vengono esportati nell'ambito di inclusione dell'enumerazione. Nell'esempio sopra, vengono dichiarati gli enumeratori Spades, Clubs, Hearts e Diamonds. Poiché gli enumeratori vengono esportati nell'ambito di inclusione, vengono considerati con ambito globale. Gli identificatori nell'esempio sono già definiti nell'ambito globale. Quindi è un errore.
Per ulteriori dettagli e problemi (:-)), consultare la sezione 3.3 "Regioni dichiarative e ambiti" della bozza Standard C++, se interessati è possibile ottenere il pdf da here (http://www.research.att.com/~bs/SC22-N-4411.pdf).
Può chiarire la tua domanda? A quale differenza ti riferisci? – trshiv
Io uso lo stesso nome quando provo cose semplici come int x = x, non è valido, provo a farlo per costrutti complessi come int arr [arr] è valido. Mi confonde –
Forse questo è ovvio, ma indipendentemente dal fatto che il codice sopra abbia un senso per il compilatore, è difficile da comprendere per un essere umano, quindi è improbabile che lo si veda nel codice esistente e poco saggio metterlo in proprio. – flies