Das Variablen einen Sichtbarkeitsbereich, 'Scope', haben wissen wir bereits. Wir errinern uns an die Aufgabe zum bestimmen des Scopes von Variablen. Doch eine Variable muss nicht immer lokal in einem Block sein, sondern sie kann auch global sein.
#include<iostream>
using namespace std;
int zahl;
int main()
{
zahl=3;
cout<<zahl<<"\n";
}Allerdings hat dies viele Nachteile.
zahl ist nun global - das bedeutet, dass wir von überall in unserem Programm auf diese Variable zugreifen können. Ansich ist das nicht schlecht, denkst du jetzt vielleicht. Aber bedenke, dass wir nun im hintersten Winkel unseres Programmes diese Variablen ändern könnten und woanders wundern wir uns dann warum diese Variable auf einmal einen ganz anderen Wert hat.
Solange wir nur so kleine Programme schreiben, kann dies zwar nicht passieren - aber wir wollen ja in die Zukunft schauen. Bald wirst du große Programme mit mehreren tausend Zeilen Code schreiben, und wer kann da noch den Überblick über viele globale Variablen halten?
Es gibt einige Methoden um eine globale Variable zu entschaerfen, diese Tricks werden wir aber erst später behandeln. Bis dahin (und auch dann) gilt: globale Variablen sind böse.
Man kann eine Variable, wie wir bereits wissen, überall in einem Block definieren und muss nicht wie früher in C (mittlerweile kann das C auch schon), alles am Blockanfang machen. Generell gilt: die Definition einer Variablen solange wie möglich aufschieben.
#include<iostream>
using namespace std;
int main()
{
int zahl;
int ergebnis;
cin>>zahl;
if(zahl>0)
{
ergebnis=zahl/2;
cout<<"Ergebnis: "<<ergebnis<<"\n";
}
else
{
cout<<"Zahl ist kleiner oder gleich 0\n";
}
}ergebnis wurde viel zu früh definiert. Viel besser wäre es gewesen, wenn wir ergebnis erst bei der Zuweisung von zahl/2 definiert hätten. Dann hätten wir uns die Variable nämlich gänzlich erspart, wenn der User eine Zahl kleiner oder gleich 0 eingegeben hätte.
Der Sinn ist der: eine Variable die so lokal wie möglich gehalten wird, ist leichter zu verstehen. Du wirst später Programme schreiben die tausende von Variablen beinhalten - und da bist du froh wenn du den Sinn einer Variablen gleich auf den ersten Blick erkennst. Betrachte dazu folgende Programme:
//Variante 1
#include<iostream>
using namespace std;
int main()
{
int a,b,c;
/*
GAAAAAAAAANZ viel Code
*/
cin>>a;
cin>>b;
c=a*b;
cout<<a<<" mal "<<b<<" ist "<<c<<"\n";
}
//Variante 2
#include<iostream>
using namespace std;
int main()
{
int zahl1; //erste vom user eingegebene Zahl
int zahl2; //erste vom user eingegebene Zahl
int ergebnis; //produkt von zahl1 und zahl2 (nach der User eingabe)
/*
GAAAAAAAAANZ viel Code
*/
cin>>zahl1;
cin>>zahl2;
ergebnis=zahl1*zahl2;
cout<<zahl1<<" mal "<<zahl2<<" ist "<<ergebnis<<"\n";
}
//Variante 3
#include<iostream>
using namespace std;
int main()
{
/*
GAAAAAAAAANZ viel Code
*/
int faktor1, faktor2;
cin>>faktor1;
cin>>faktor2;
int produkt=faktor1*faktor2;
cout<<faktor1<<" mal "<<faktor2<<" ist "<<produkt<<"\n";
}Wie wir sehen ist Variante 3 am besten. Denn wir sehen sofort wozu welche Variable existiert. Gute Namensgebung gehört hier natürlich auch dazu! Namensgebung ist ein sehr wichtiger Aspekt, denn der Name einer Variablen soll ausdrücken warum sie existiert.