In diesem Beispiel wird dreimal die Variable int i deklariert und auch definiert. Man könnte meinen, daß sie jedesmal überschrieben würde, aber dem ist nicht so. Das Programm wird nämlich der Reihe nach die Werte 4, 7 und 2 ausgeben. Wie kommt dies?
Das Ergebnis liegt daran, daß der Compiler die Variable verschiedenen Gültigkeitsbereichen zuordnet. Ein Gültigkeitsbereich kann dabei die Dateiebene, eine Funktionsebene aber auch eine Ebene sein, die durch eine Blockanweisung gebildet wird. Während die erste Deklaration global erfolgt, d.h. auf Dateiebene, erfolgen die anderen beiden lokal in zwei verschiedenen Funktionen (nämlich funktB und main).
Damit werden dann drei verschiedene Variablen deklariert, die sich nicht in ihrem Namen, sondern nur in ihrem Gültigkeitsbereich unterscheiden. Es wird immer die Variable bevorzugt genutzt, die im selben Gültigkeitsbereich wie der aktuelle Programmteil liegt. Falls im aktuellen Programmteil keine Variablen dieses Namens definiert ist, wird im nächsthöheren gesucht und so fort.
Oft übersehen wird die Tatsache, daß auch Blockanweisungen eigene Gültigkeitsbereiche haben, was vor allem bei Schleifen und if-Anweisungen auftreten kann:
void main() { for(int i=1;i<=9;i++) { // neuer Gültigkeitsbereich for(int j=7;j>0;j--) { // noch einer int i; // i lokal in zweiter Blockanw. i=j*j*j; cout << i << endl; } // zweites i wird vergessen } // j wird vergessen out << i << endl; // geht, da erstes i im main-scope }