C Scope


C Scope

Scope


Einen Block existiert überall dort, wo Klammern die { }  gesetzt sind und an solchen Stellen, an denen die Klammern als kurchschreibweise weggelassen werden:


{
       // äußerer block

       {

             // innerer block

       }

}

Die Regel ist, dass Variablen, die in einem inneren Block definiert werden im äußeren Block nicht existieren. Wir sprechen dabei vom Scope, oder Sichtbarkeitsbereich der Variable:
#include <stdio.h>

int global = 0; // diese variable existiert überall

int main(void)
{
       int a = 1;
       if(a > 0)
       {
             int b = 2; // exxistiert nur in dieser if-bedingung

             printf("global: %d", global); // funktioniert

             printf("a: %d", a); // funktioniert
       }

       // printf("b: %d", b); würde nicht funktionieren!

       return 0;
}

Zum Beispiel kann man überall auf die Variable global zugreifen, während a nur in der main-Methode existiert. b wiederum kann nicht außerhalb der if-Bedingung aufgerufen werden.

Überdeckung


Jede Variable lässt sich pro Block nur einmal definieren, alles andere führt zu einem Fehler:



int value = 20;
int value = 5; // fehler! Programm lässt sich nicht starten


Weil es aber umständlich wäre jeder Variablen einen anderen Namen zu geben,  kann man den Variablennamen in einem andern Block nochmal verwenden. Also ist folgender Code korrekt:



       int value = 20;
       {
             int value = 5;
       }
 

 Der Wert der alten Variable wird dabei übderdeckt:



#include <stdio.h>

int main(void)
{
       int value = 20;

       // klammern bestimmen den scope
       {
             printf("(1) value: %d\n", value); // value = 20 (aus äußeren scope)

             int value = 5;             // überdeckung!
                                        // value außerhalb des blocks
                                        // bleit unverändert

             printf("(2) value: %d\n", value); // value = 5 (aus inneren scope)
       }

       printf("(3) value: %d\n", value);       // value = 20

       getchar();
       return 0;
}



Keine Kommentare:

Kommentar veröffentlichen

Inhalt