Home
Navigation
Impressum
Coder Welten - Programmierung und Optimierung
Coder Welten
 
 

 

 

Variablen in C und C++, Deklaration und Definition

Variablen und Bezeichner in C und C++

Übersicht / Seite:

  1. Deklaration und Definition (von Variablen mit Beispielen und Listings)
  2. Datentypen und Sichtbarkeit (Gültigkeitsbereich und Typen von Variablen)

Variablen und Bezeichner im Allgemeinen

Ein einfaches "Hallo Welt" Programm zur Vorstellung einer Programmier- oder Scriptsprache kommt noch ohne Variablen aus, doch so wie ein Beginner etwas tiefer in einer neu zu erlernenden Sprache einsteigen möchte, kommt er nicht mehr an Variablen vorbei. Eine Variable ist eigentlich nichts weiter als ein Bezeichner, dem ein Wert zugeordnet wird und ein Speicherplatz im System, wo dieser zugeordnete Wert abgelegt und gespeichert werden kann. Eine Variable ist somit die Adresse eines Speicherplatzes im System und der Bezeichner einer Variablen verweist auf diese Adresse.
Die Verwendung von Variablen hat unter anderem den Vorteil, dass im Programmverlauf nicht jedes Mal der Wert eingefügt werden muss, sondern einfach der Bezeichner verwendet werden kann, wobei sich dieser Wert im Laufe der Abarbeitung des Programms ändern kann. Bevor eine Variable verwendet werden kann, muss selbige definiert und deklariert werden. Und spätestens an diesem Punkt bekommt ein Einsteiger zum ersten Mal graue Haare und wird feststellen, dass es sich bei C und C++ um alles andere, nur nicht um Programmiersprachen handelt, die leicht erlernbar wären. Doch was ist nun eigentlich eine Deklaration und was ist eine Definition?

Was ist eine Deklaration und was ist eine Definition?

Da Programmiersprachen vom Menschen entworfen werden, könnte der Einsteiger darauf schließen, dass die Begriffe Deklaration und Definition Rückschlüsse auf ihre Bedeutung im normalen Sprachgebrauch erlauben. So könnte eine Deklaration für eine Erklärung oder für eine Inhalts- oder Wertangabe stehen. Eine Definition könnte hingegen das Wesen einer Erklärung beschreiben und den Inhalt oder die Werte eindeutig bestimmen. Möglicherweise hilft an dieser Stelle ein Beispiel als Vergleich weiter, um die Bedeutung einer Deklaration und Definition besser einzuordnen.
Es sei angemerkt, beinahe alle Vergleiche hinken, dennoch lässt sich ohne beispielhafte Vergleiche einiges nur begrenzt verdeutlichen. Der nachfolgende Vergleich erinnert entfernt an eine Fabel, bedient sich jedoch nur einer nichtmenschlichen Spezies für einen Vergleich.

Nehmen wir an, einige Völker der Honigbiene hätten eines Tages genug davon, dass ihr emsig gesammelter Honig von den Imkern bei der Ernte durch Zuckerlösungen ausgetauscht wird, fühlen sich ausgebeutet und veröffentlichen eine gemeinsame Deklaration über die grundsätzlichen Rechte auf angemessene Entlohnung. Nehmen wir weiterhin an, dass diese Deklaration allseitig unter den Bienenvölkern auf Zustimmung stoßen würde und der Wortlaut dieser Deklaration auch an alle größeren Imker-Verbände übermittelt wurde.
Trotz dieser Deklaration könnten Imker bei Verstößen gegen diese Deklaration nicht zur Verantwortung gezogen werden. Zumindest nicht bevor die jeweiligen Gesetzgeber der einzelnen Bienenvölker eindeutige Definitionen in ihren Gesetzeswerken aufnehmen und somit in diesen Gesetzeswerken definieren, welche Sanktionen den Imkern bei welchen Vergehen drohen.

Leider beruht die Sprache von Programmierern nicht immer auf den alltäglichen Sprachgebrauch und weil die Begriffe Deklaration und Definition das durchschnittliche Verständnis von Einsteigern noch nicht genug strapazieren, wird noch zusätzlich der Begriff Initialisierung verwendet. Dieser Begriff leitet sich vom lateinischen Wort initium ab und steht für Anfang oder Beginn. Ein verwandter Begriff ist zum Beispiel die Initiale, die für den Anfangsbuchstaben eines Kapitels steht und im Plural für die Anfangsbuchstaben eines Namens. Im Bereich der elektronischen Datenverarbeitung steht eine Initialisierung für die Zuweisung eines Anfangswertes. Nachfolgend einige Stichpunkte und praktische Beispiele.

Deklaration, Definition und Initialisierung von Variablen in Stichpunkten

Um ein wenig mehr Ordnung in das Chaos der Begriffe zu bekommen, eine kleine Auflistung wichtiger Stichpunkte:

  • Deklaration: Mit der Deklaration einer Variablen wird der Typ der Variablen (z.B. der Datentyp int für ganze Zahlen) festgelegt und der namentliche Bezeichner für diese Variable. Eine korrekte Deklaration ist vor allem für den Compiler von Bedeutung, denn dieser muss wissen, wie der im Speicher abgelegte Wert zu interpretieren ist.
  • Definition: Mit der Definition wird der erforderliche Speicherplatz für eine Variable reserviert. Eine korrekte Definition ist vor allem für den Linker von Bedeutung.
  • Initialisierung: Mit der Initialisierung wird der Variablen ein Anfangswert zugewiesen, der sich während des Programmablaufs ändern kann, jedoch nicht zwangsläufig ändern muss.
  • Zuweisung: Bei der Initialisierung erfolgt die Zuweisung des rechts stehenden Operanden (Anfangswert) zum links stehen Operanden (Bezeichner der Variablen) durch einen Zuweisungsoperator (=). Statt einer Initialisierung durch einen einzelnen Anfangswert, kann einer Variablen ein berechneter Wert von anderen Speicheradressen zugewiesen werden.
  • cw_tabs

Beispiele und Listings

Im ersten Listing verweigert der Compiler seinen Dienst und im Buildprotokoll wird der Fehler - 'Mehrheit': nichtdeklarierter Bezeichner - aufgeführt. Wie aus dem Beispiel ersichtlich, wurde zwar ein Bezeichner benannt, jedoch kein Typ für die Variable benannt, womit dieser Bezeichner als nicht nichtdeklariert gilt.

#include <stdio.h>

int main() {

    Mehrheit;      // 'Mehrheit': nichtdeklarierter Bezeichner

    printf("Deklaration fuer %d Stimme Mehrheit.\n", Mehrheit);

    getchar();
    return 0;
}

Im zweiten Listing wird nur eine Warnung ausgegeben, während der Compiler nach Bestätigung der Mitteilung seine Arbeit verrichtet, da die Variable "Mehrheit" deklariert und definiert, jedoch nicht initialisiert wurde. Im Buildprotokoll erscheint der Hinweis: Die nicht initialisierte lokale Variable "Mehrheit" wurde verwendet.

#include <stdio.h>

int main() {

    int Mehrheit;   /*  Die Variable 'Mehrheit' wird
                       ohne Initialisierung verwendet. */

    printf("Deklaration fuer %d Stimme Mehrheit.\n", Mehrheit);

    getchar();
    return 0;
}

Fehlende
        Initialisierung der verwendeten Variablen
Fehlende Initialisierung der verwendeten Variablen

Wie aus dem Bild ersichtlich wird, hatte die Nicht-Initialisierung der Variablen zu Folge, dass irgend ein sich zufällig im Speicher befindlicher Wert für die Ausgabe verwendet wurde.

Im dritten Listing wird ein Abstimmungsergebnis errechnet. Abgestimmt hatten insgesamt 820 von regionalen und überregionalen Bienenvölkern delegierte Teilnehmer über die weiter oben als Vergleich erwähnte Deklaration und über eine entsprechende Gesetzesvorlage. Mit 412 Ja-Stimmen wurde eine Mehrheit erreicht.

#include <stdio.h>

int main() {

    int delegierteTe = 820;   
    int einfacheMehr = delegierteTe / 2;  
    int Befuerworter = 412;
    int Mehrheit; 

    if (einfacheMehr < Befuerworter){

        Mehrheit = Befuerworter - einfacheMehr;
        printf("Die Deklaration wurde mit %d Stimmen Mehrheit angenommen.\n", Mehrheit);
    }
    else
        printf("Die Deklaration wurde abgelehnt.\n");

    getchar();
    return 0;
}

In diesem Listing wurden alle Variablen mit Typ und Bezeichner deklariert und definiert, wobei nur der Typ int für ganze Zahlen verwendet wurde, da halbe Stimmen bei der Abstimmung nicht zählten. Der Bezeichner für die Anzahl der delegierten Teilnehmer und der Bezeichner für die Anzahl der Befürworter wurden darüber hinausgehend mit einem Wert initialisiert. Dem Bezeichner für die einfache Mehrheit wurde hingegen nur die durch 2 geteilte Anzahl der delegierten Teilnehmer zugewiesen und der Bezeichner Mehrheit erhält nur unter der Bedingung den zugewiesen Wert einer Rechenoperation, wenn das Abstimmungsergebnis positiv ausfällt, was im Beispiel mit 412 Ja-Stimmen der Fall ist.

Deklaration, Definition und Initialisierung von Variablen
Korrektes Abstimmergebnis durch die richtige Deklaration, Definition
und Initialisierung der verwendeten Variablen.

Deklaration und Definition in der Literatur

Wer sich durch die einschlägige, im Handel erhältliche oder im Web veröffentlichte Literatur kämpft, wird auf unterschiedliche, teilweise widersprüchliche, meistens jedoch schwer verständliche Erklärungen stoßen. Ein Vergleich mit anderen Script- und Programmiersprachen könnte ein wenig helfen.

Deklaration, Definition und Initialisierung von Variablen
Alle Kommentare stehen für links = rechts vom Zuweisungsoperator.

In C/C++:

int main() {
    /*
     Deklaration und Definition durch Bekanntgabe 
     des Typs und des Bezeichners = Initialisierung mit einem Wert
    */
    int Bezeichner = 10;
}

// Möglicher Fehler, deklarierte aber undefinierte Varaiable

Bezeicher;
printf("%d\n", Bezeicher);  // nicht deklarierter Bezeichner

// Möglicher Fehler, deklarierte und definierte, aber nicht initialisierte Varaiable

int Bezeichner;
printf("%d\n", Bezeicher);  // nicht initialisierte Variable


In PHP:
function name() {
    /*
     Deklaration = Definition und Initialisierung mit einem Wert, 
     wobei der Typ des Wertes erkannt wird 
    */
    $Bezeichner = 10;
}

// Möglicher Fehler, deklarierte aber undefinierte Variable

$zeile;
echo $zeile;  // Notice: Undefined variable
In JavaScript:
function name() {
    /*
     Deklaration = Definition und Initialisierung mit einem Wert, 
     wobei der Typ des Wertes erkannt wird 
    */ 
    var Bezeichner = 10;
}

// Möglicher Fehler, deklarierte aber undefinierte Variable

var Bezeichner;
document.write(Bezeichner);   // Ausgabe: undefined 

Aus dem Vergleich wird ersichtlich, dass in C/C++ Deklaration und Definition mehr oder weniger ineinander verschwimmen, da bei der Deklaration einer Variablen diese ebenfalls durch die Zuweisung eines Typs (im Beispiel int) definiert wird. Anders hingegen in PHP oder JavaScript, wo der Typ von dem bei der Initialisierung zugewiesenen Wert abhängig ist.
Eine Ausnahme gibt es in C/C++, jedoch nur insofern das Schlüsselwort "extern" verwendet wird. Für eine Variable, die mit extern deklariert wurde, wird kein Speicher reserviert, da durch das Schlüsselwort extern dem Compiler mitgeteilt wird, dass die Variable als nicht definiert gilt, weil sie bereits innerhalb des Codes einer externen, jedoch zur Anwendung gehörenden Datei definiert wurde.


Hinweis: In einem Listing auf dieser Seite wurde ein if-Statement verwendet, wobei sich der Einsatz und die Schreibweise (Syntax) dieser Kontrollstruktur kaum von der in Perl, PHP oder JavaScript unterscheidet.

weiterlesen: Variablen » Typen und Sichtbarkeit

 

Copyright © Verlag Horst Müller - Stendal - 2006 - Impressum - Datenschutz - Nutzungsbedingungen