global, lokal
-
hallo leute
ich frage mich ob mein compiler spinnt.#include<iostream> using namespace std; int a = 10, b = 20; //Definiere Global int main() { cout << a << endl << b << endl; //Anzeige Global int a = 1, b = 2; //Definiere Lokal cout << a << endl << b << endl; //Anzeige Lokal // Neuer Block { // int a, b; a = 10000; b = 20000; cout << a << endl << b << endl; //Anzeige Neuer Block } //Ab hier wieder Lokal cout << a << endl << b << endl; return 0; }
die ausgabe davon ist folgende.
10
20
1
2
10000
20000
10000
20000
das verstehe ich nicht weil der sollte doch
10
20
1
2
10000
20000
10
20
anzeigen, also Global, Lokal, Neuer Block und wieder Lokal
wenn ich aber im Neuer Block a und b deklariere dann macht er das auch, wenn ich a und b nicht deklariere dann zeigt er den wert aus dem letzten block an!ist das normal oder spinnt mein compiler.
dev-cc 4.9.8.5 mit mingw-compiler.
danke , bye
-
Der "letzte Block", wie du ihn nennst, ist kein vorhergehender, sondern dein "neuer Block" ist in diesen eingebettet! Das heisst, dieser Block kennt deine Variablen, die du im übergeordneten Block deklariert und definiert hast natürlich auch!
-
ja da habe ich mich falsch ausgedrückt!
im "eingebetteten block" werden den variablen a + b werte zugewiesen, ist es normal das die werte jetzt auch aus diesem "eingebetteten block" heraus angenommen werden.
ich meine normal müßte die letzte cout-ausgabe doch wieder die ausgabe vom äußeren block haben. wenn ich aber im "eingebetteten block" den datentyp deklariere dann macht er das ja auch.
also anders gefragt, muß man den datentyp in einem neuen eingebetteten block deklarieren?
irgendwie verstehe ich die logik jetzt nicht mehr .... datentyp angeben also bleiben die werte "im (eingebetteten) block", wenn nicht angeben dann werden die werte auch außerhalb des "eingebetteten block"s übernommen?
-
Hier mal der Unterschied den ich meine.
#include<iostream> using namespace std; int a = 10, b = 20; //Definiere Global int main() { cout << a << endl << b << endl; //Anzeige Global int a = 1, b = 2; //Definiere Lokal cout << a << endl << b << endl; //Anzeige Lokal // Neuer Block { // int a, b; a = 10000; b = 20000; cout << a << endl << b << endl; //Anzeige Neuer Block } //Ab hier wieder Lokal cout << a << endl << b << endl; return 0; }
dann diese ausgabe
10
20
1
2
10000
20000
10000 ** Warum die Werte aus dem eingebetteten Block ???? **
20000 ** Hier müsste doch 10 + 20 stehen ?? **#include<iostream> using namespace std; int a = 10, b = 20; //Definiere Global int main() { cout << a << endl << b << endl; //Anzeige Global int a = 1, b = 2; //Definiere Lokal cout << a << endl << b << endl; //Anzeige Lokal // Neuer Block { /* Anders als eben wird jetzt der Datentyp für diesen eingebetteten Block angegeben*/ int a, b; a = 10000; b = 20000; cout << a << endl << b << endl; //Anzeige Neuer Block } //Ab hier wieder Lokal cout << a << endl << b << endl; return 0; }
dann diese ausgabe
10
20
1
2
10000
20000
10 ** 10 + 20 sind die Werte aus dem "äusseren Block" **
20
-
#include<iostream> using namespace std; int a = 10, b = 20; //Definiere Global int main() { cout << a << endl << b << endl; //Anzeige Global int a = 1, b = 2; //Definiere Lokal cout << a << endl << b << endl; //Anzeige Lokal // Neuer Block { // int a, b; a = 10000; b = 20000; cout << a << endl << b << endl; //Anzeige Neuer Block } //Ab hier wieder Lokal cout << a << endl << b << endl; return 0; }
Das a und b im inneren Block ist das selbe wie das im äusseren! Jetzt kapiert?
-
Das a und b im inneren Block ist das selbe wie das im äusseren! Jetzt kapiert?
wenn das so ist, bzw. sein soll dann müßte er das ja auch so anzeigen.compiler spinnt also ?
-
#include<iostream> using namespace std; int a = 10, b = 20; int main() { cout <<"L "<< a << "\t" << b << endl; cout<<"G " << ::a << "\t" << ::b << endl; { int a = 1, b = 2; //Definiere Lokal cout<<"L " << a << "\t" << b << endl; cout<<"G " << ::a << "\t" << ::b << endl; // Neuer Block { a = 10000; b = 20000; cout<<"L " << a << "\t" << b << endl; //Anzeige Neuer Block cout<<"G " << ::a << "\t" << ::b << endl; //Anzeige Neuer Block } //Ab hier wieder Lokal cout<<"L " << a << "\t" << b << endl; cout <<"G "<< ::a << "\t" << ::b << endl; } cout<<"L " << a << "\t" << b << endl; cout <<"G "<< ::a << "\t" << ::b << endl; return 0; }
Schnapp Dir nen Debugger und staune
Sobald lokal etwas deklariert bzw. definiert (*mal was auf die Goldwage pack*) ist dies sichtbar bis die { zuende geht. Nur weil danach eine neue { kommt ändert sich nix drann. Das was zuletzt gesehen wurde gilt.
An die Globale Variable kommst Du mit :: rann.
Probier das oben mal aus (mim Debugger) vllt. wirds dann deutlicher.
-
kiki schrieb:
#include<iostream> using namespace std; int a = 10, b = 20; //Definiere Global int main() { cout << a << endl << b << endl; //Anzeige Global int a = 1, b = 2; //Definiere Lokal cout << a << endl << b << endl; //Anzeige Lokal // Neuer Block { /* Anders als eben wird jetzt der Datentyp für diesen eingebetteten Block angegeben*/ int a, b; a = 10000; b = 20000; cout << a << endl << b << endl; //Anzeige Neuer Block } //Ab hier wieder Lokal cout << a << endl << b << endl; return 0; }
dann diese ausgabe
10
20
1
2
10000
20000
10 ** 10 + 20 sind die Werte aus dem "äusseren Block" **
20Hier wird am Ende nicht 10 und 20 sondern 1 und 2 ausgegeben, da die Variablen aus dem lokalen nicht aus dem globalen bereich benutzt werden.
Und da bei deinem ersten Programm am Ende 10000 und 20000 am Ende rauskam stimmt auch, weil du die Variablen im innersten Block nicht neu definiert hast.
Code-Hacker