Variable im Anweisungsblock ändern

OP (Firma: allround) #1138569
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
Gast
"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.
OP (Firma: allround)
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.