Bei der Deklaration und Definition von Variablen ist es zwingend erforderlich den Typ und den
Gültigkeitsbereich zu berücksichtigen. So ist der Typ einer Variablen von entscheidender Bedeutung bei der Reservierung des
Speicherplatzes, denn ohne eine Typ-Angabe könnte der Compiler nicht wissen, wie groß der zu reservierende Speicherplatz in
Bit und Bytes sein sollte oder wie die übergebenen Werte zu kodieren sind.
Der Gültigkeitsbereich entscheidet hingegen darüber, ob auf eine Variable zum Beispiel nur innerhalb einer Funktion existiert
oder ob noch in weiteren Funktionen auf diese Variable zugegriffen werden kann.
Die Sichtbarkeit bzw. der Gültigkeitsbereich einer Variablen richtet sich danach, wo im Code einer
Anwendung eine Variable deklariert und definiert wurde. Entscheidend für die Sichtbarkeit ist der in geschweifte Klammern
gefasste Anweisungsblock, in dem eine Variable deklariert und definiert wurde. Sind in diesem Anweisungsblock weitere
Anweisungsblöcke eingeschlossen, so ist eine Variable auch in diesen eingeschlossenen Blöcken sichtbar, nicht hingegen
umgekehrt.
Nachfolgen zwei Beispiele zum besseren Verständnis.
Code der C Datei sichtbarkeit.c
#include <stdio.h> int main() { int zweihundert = 220; int fuenfhundert = 550; printf("Ausgangswert von int zweihundert: %d\n", zweihundert); printf("Ausgangswert von int fuenfhundert: %d\r\n\r\n", fuenfhundert); if (zweihundert >= 200) { int zweihundert = 200; fuenfhundert = 500; printf("innerhalb: %d\n", zweihundert); printf("innerhalb: %d\r\n\r\n", fuenfhundert); } printf("au\xe1 \berhalb: %d\n", zweihundert); printf("au\xe1 \berhalb: %d\n", fuenfhundert); getchar(); return 0; }
Sichtbarkeit von Variablen
Im ersten Beispiel wurden die Variablen int zweihundert und int fuenfhundert innerhalb der
Eintrittsfunktion am Anfang der Funktion notiert und beide Variablen sind somit in der ganzen Funktion sichtbar. Die Lebensdauer
beider Variablen endet erst mit der schließenden Klammer der Funktion.
Anders sieht es mit der Variablen int zweihundert aus, die innerhalb des Anweisungsblockes notiert wurde, der zum if-Statement
gehört. Diese zweite Variable ist nur innerhalb dieses Blockes gültig und überlagert nur innerhalb dieses Blockes die erste,
gleichnamige Variable. Dementsprechend fällt die Ausgabe aus. Da die Variable außerhalb des Blocks nicht mehr zu sehen ist,
wird die Variable zweihundert mit dem Ausgangswert von 220 ausgegeben und nicht mit dem innerhalb des Anweisungsblocks auf 200
veränderten Wert.
Mit dem Wert der Variablen fuenfhundert verhält es sich hingegen nicht so. Da diese Variable nicht innerhalb des Blockes neu
definiert wurde, die erste Variable somit auch nicht innerhalb des zum if-Statement gehörenden Anweisungsblocks überlagert
wird, verändert sich deren Wert bei der Ausgabe wie erwartet.
Code der C++ Datei sichtbarkeit.cpp
#include <iostream> using namespace std; int zweihundert = 220; int fuenfhundert = 550; int main() { cout << "Ausgangswert von int zweihundert: " << zweihundert << endl; cout << "Ausgangswert von int fuenfhundert: " << fuenfhundert << endl << endl; if (zweihundert >= 200) { int zweihundert = 200; int dreihundert = 300; fuenfhundert = 500; cout << "innerhalb: " << zweihundert << endl; cout << "innerhalb: " << dreihundert << endl; cout << "innerhalb: " << fuenfhundert << endl << endl; } cout << "au\xe1 \berhalb: " << zweihundert << endl; cout << "au\xe1 \berhalb: " << fuenfhundert << endl; cin.get(); return 0; }
Sichtbarkeit von lokalen und globalen Variablen
Im zweiten Beispiel wurden die Variablen int zweihundert und int fuenfhundert nicht innerhalb der
Eintrittsfunktion notiert, sondern oberhalb von dieser, womit beide Variablen als globale Variablen nicht nur der main-Funktion,
sondern allen Funktionen zur Verfügung stehen würden, insofern weitere Funktionen in dieser Datei notiert werden sollten.
Die Sichtbarkeit und Lebensdauer der Variable int dreihundert beschränkt sich hingen nur auf den zum if-Statement gehörenden
Anweisungsblock, ein Zugriff außerhalb dieses Blocks auf diese Variable würde einen Fehler auslösen. Mit der inneren
Variable zweihundert verhält es sich hingegen wie im ersten Beispiel.
Wie bereits auf der vorausgehenden Seite unter Deklaration und Definition vermerkt, ist es erforderlich
bei der Deklaration einer Variablen einen Datentyp anzugeben. Anderenfalls würde beim Debuggen eine Fehlermitteilung
ausgegeben.
Der Datentyp entscheidet darüber, wieviel Speicherplatz für eine Variable zu reservieren ist und welche Operationen mit dem
gespeicherten Wert durchgeführt werden können. So würde zum Beispiel bei der Verwendung von char ein Speicherplatz von 1 Byte
reserviert, bei short von 2 Byte und bei Verwendung von int 4 Byte.
Das hört sich bei den heutigen Speichervolumen verschwindend wenig an, doch es gab auch Zeiten, bei denen der Arbeitsspeicher
von Rechnern wesentlich begrenzter war und bei Mikrokontrollern ist es teilweise noch heute so.
In der Übersicht wurden die wichtigsten Datentypen für C und C++ berücksichtigt. Unterschieden wird ferner zwischen
vorzeichenbehaftet (signed) und vorzeichenlos (unsigned). Erfolgt keine Angabe, so verteilt sich der
Wertebereich wie bei der Verwendung des Schlüsselwortes signed zu (beinahe) gleichen Teilen auf negative und positive
Zahlen.
Eine Angabe des Schlüsselwortes signed ist bei den Datentypen short, int und long nicht erforderlich, da Standard. Lediglich ob
char ohne Angabe von signed als vorzeichenbehafteter oder vorzeichenloser Wertebereich interpretiert wird, ist vom Compiler
abhängig.
Bei Verwendung des Schlüsselwortes unsigned verschiebt sich der Wertebereich in den positiven Bereich ganzer Zahlen, wodurch
der Wertebereich nicht wirklich größer wird, weil zum Beispiel ein Manko nicht mehr berechnet werden könnte.
Die Größe des Wertebereiches von int ist vom System abhängig und würde bei einem Rechner mit einer 16-Bit-Architektur nur
dem Wertebereich von short entsprechen.
Übersicht Datentypen:
Ganzzahlige Datentypen signed in C/C++ char -128 bis +127 short -32768 bis +32767 int -2147483648 bis +2147483647 (int für integer) long -2147483648 bis +2147483647 long long -9223372036854775808 bis +9223372036854775807 Ganzzahlige Datentypen unsigned in C/C++ unsigned char 0 bis 255 unsigned short 0 bis 65535 unsigned int 0 bis 4294967295 unsigned long 0 bis 4294967295 unsigned long long 0 bis 18446744073709551615 Datentypen für Fließkommazahlen in C/C++ float double long double Weitere Datentypen in C++ bool In C mit <stdbool.h>, falls vorhanden wchar_t In C mit <stddef.h>, falls vorhanden
Zusätzlich zu diesen Datentypen können noch eigene Datentypen definiert oder bereits definierte verwendet werden. Auch beim Datentyp string in C++ handelt es sich lediglich um eine definierte, jedoch sehr dienliche Klasse.
Einstieg in C/C++
Win32-API
NET Framework