Forum: Compiler & IDEs Variable im Anweisungsblock ändern


von Udo S. (Firma: allround) (1udo1)


Lesenswert?

Hallo,

habe eine Frage zum Galileo- Tutorial

Titel http://www.hs-augsburg.de/~sandman/c_von_a_bis_z/c_011_005.htm
1
/* lokal_var2.c */
2
3
#include <stdio.h>
4
int main(void)
5
{
6
   int i = 333;
7
8
   if(i == 333)
9
      {
10
        i = 111;             // ZEILE A,ZUWEISUNG, keine DEKLARATION !
11
        printf("%d\n",i);    // ZEILE B Ausdruck 111 
12
      }
13
14
   printf("%d\n",i);         // ZEILE C Ausdruck 111, weil Variable i nur verändert wurde 
15
   return 0;
16
}

In Galileo steht:

Lokale Variablen, die in einem Anweisungsblock definiert wurden, sind 
außerhalb dieses Anweisungsblocks nicht gültig.
1
/* lokal_var3.c */
2
3
#include <stdio.h>
4
5
int main(void)
6
 {
7
   int i=333;
8
     if(i == 333) 
9
     {
10
        int i = 666;
11
          {
12
          i = 111;              // ZEILE D,ZUWEISUNG, keine DEKLARATION !
13
          printf("%d\n",i);     // ZEILE E Ausdruck 111 
14
          }
15
        printf("%d\n",i);       // ZEILE F Ausdruck 111 
16
     }
17
18
     printf("%d\n",i);           // ZEILE G Ausdruck 333 
19
     return 0;
20
}


Zeile C ist ausserhalb der IF-Anweisung und Zeile G ist auch ausserhalb 
der IF- Anweisung. In beiden Fällen wurde innerhalb der IF-Anweisung in 
Zeile A bzw. Zeile D die Variable per Zuweisung (Definition??) geändert.

Ich verstehe nicht, warum die Variable i in Zeile G mit 333 ausgedruckt 
wird, obwohl ihr doch in Zeile D ein neuer Wert zugewiesen (definiert??) 
wurde, aber nicht neu deklariert wurde. Es wird einen Unterschied 
zwischen Zeile C und Zeile G geben. Aber welcher?

Udo

von SULI (Gast)


Lesenswert?

DAs eine i ist global
und das andere i ist lokal

von Reisender (Gast)


Lesenswert?

"Global" ist ein Variable dann und nur dann, wenn sie ausserhalb jeder 
Funktion deklariert wird.

"Definieren" belegt tatsächlich Speicherplatz
"Deklarieren" sagt nur, das woanders (in einer anderen Datei) eine 
Definition stehen sollte. (Wenn nicht gibts Linker fehler).

Ein "Anweisungsblock" ist der Code zwischen zwei geschweiften Klammern 
(jeweils öffnend und schliessend). So kommt er in einer 
Funktionsdefinition vor. Ausserdem kann er verschachtelt werden. Also 
ein Block in einem Block in einem Block.
Dies bezeichnet gleichzeitig sogenannte Gültigkeitsbereiche.
Der erste ist der globale Gültigkeitsbereich ausserhalb jeder Funktion. 
Deine beiden Beispiele beinhalten solche nicht. (Es sei denn, in den 
include files stehen Definitionen).

Danach kommt der GB (Gültigkeitsbereich) der Funktion main.
Innerhalb dessen wird eine Variable i definiert. Jede Verwendung einer 
Variablen bezieht sich auf den momentan aktuellen GB oder (falls in 
diesem die Variable nicht enthalten ist) auf den nächst-übgergeordneten 
GB.

Da in dem zweiten Beispiel ein weiterer Anweisungsblock aufgemacht wird 
und eine weitere Variable i definiert, beziehen sich die Anweisungen D, 
E und F auf die in dem innersten Anweisungsblock definierte Variable i. 
Die Anweisung G hingegen bezieht sich wieder auf das i des äusseren 
Anweisungsblockes was man auch daran erkennt, das der innere schon 
geschlossen ist (wenn man von oben nach unter liest).

Jeweils eine einzelne Zeile C und G miteinander zu vergleichen hilft 
hier nicht, weil es darauf ankommt, was noch vorher passiert.
In dem ersten Fall wird zwar ein weiterer Anweisungsblock aufgemacht, 
aber keine neue Variable i innerhalb dieses Blocks definiert, so das 
eine Anweisung, welche i verändert sich auf das im nächstäusseren Block 
definierte i bezieht.
Im zweiten Fall aber wird in dem inneren Block auch ein i definiert, so 
das die Änderung nun an diesem vollzogen wird.

Du musst Dir das mit dem Geltungsbereich nicht wie eine lineare Kette 
sondern wie Schachteln in Schachteln in Schachteln vorstellen. Eine 
Anweisung in einer Schachtel greift auf Objekte zu die in ihr selbst 
vorhanden sind bzw. falls keine dort sind, in einer der äusseren 
Schachteln in der auch sie enthalten ist.

Klar?

Lies noch mal den Text in dem Buch vom Galileo Verlag. Dort ist 
eigentlich alles so auch gesagt und beschrieben.

von Udo S. (Firma: allround) (1udo1)


Lesenswert?

Hallo Reisender,

deine ausführliche Erklärung werde ich mal graphisch aufzeichnen. 
Zusätzlich lese ich noch mal eingehender in Galileo weiter. Danke für 
deine guten und verständlichen Ausführungen. Hast dir ja echt Mühe 
gemacht. Freue mich darüber. Dein Gesagtes muss erst mal sacken. Wenn es 
noch einmal klemmt, melde ich mich.
Natürlich auch Danke an SULI.

Schönen Gruß

Udo

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.