Antworten

Content

Zu den ersten beiden Fragen: answer ist global, alle anderen Variablen sind lokal. answer ist ab der Deklaration im gesamten Programm zu sehen, i innerhalb der for-Schleife, val innerhalb des Blocks innerhalb der for-Schleife.

Alle globalen Variablen werden nur einmal instantiiert. Die for-Schleifen-Variable i wird hier nur einmal instantiiert, die Variable val bei jedem Schleifendurchlauf, d.h. insgesamt fünf Mal.

Da val nicht initialisiert wird, ist der Wert hier immer undefiniert und damit auch der Wert, der nachfolgend ausgegeben wird. Es ist damit zu rechnen, dass es auf unterschiedlichen Plattformen oder der Verwendung unterschiedlicher Compiler oder Übersetzungsoptionen verschiedene Resultate entstehen.

Beispiel:

theon$ g++ -Wall -o vars vars.cpp
theon$ ./vars
-1073748072
42
43
44
45
theon$ 

In diesem Fall wurde zunächst -1073748072 ausgegeben, ein Wert der zufällig in der entsprechenden Speicherfläche stand. Auch wenn die Variable immer neu instantiiert wird, liegt die Annahme nahe, dass sie sich an der gleichen Speicherlokation auf dem Stack befindet. D.h. sie behält hier offenbar den Wert. Dies ist aber keinesfalls sichergestellt.

Interessant ist hier übrigens, dass bei eingeschalteten Optimierungen sich der Übersetzer mehr Zeit für Analysen nimmt, die wiederum zu Warnungen führen können:

theon$ g++ -Ofast -Wall -o vars vars.cpp
vars.cpp: In function 'int main()':
vars.cpp:8:20: warning: 'val' may be used uninitialized in this function [-Wmaybe-uninitialized]
       std::cout << val << std::endl;
                    ^~~
theon$

Es werden aber keinesfalls alle denkbaren Fälle auf diese Weise entdeckt.