www.mikrocontroller.net

Forum: Compiler & IDEs Variable im Anweisungsblock ändern


Autor: Udo Scharnitzki (Firma: allround) (1udo1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

habe eine Frage zum Galileo- Tutorial

Titel http://www.hs-augsburg.de/~sandman/c_von_a_bis_z/c...
/* lokal_var2.c */

#include <stdio.h>
int main(void)
{
   int i = 333;

   if(i == 333)
      {
        i = 111;             // ZEILE A,ZUWEISUNG, keine DEKLARATION !
        printf("%d\n",i);    // ZEILE B Ausdruck 111 
      }

   printf("%d\n",i);         // ZEILE C Ausdruck 111, weil Variable i nur verändert wurde 
   return 0;
}

In Galileo steht:

Lokale Variablen, die in einem Anweisungsblock definiert wurden, sind 
außerhalb dieses Anweisungsblocks nicht gültig.
/* lokal_var3.c */

#include <stdio.h>

int main(void)
 {
   int i=333;
     if(i == 333) 
     {
        int i = 666;
          {
          i = 111;              // ZEILE D,ZUWEISUNG, keine DEKLARATION !
          printf("%d\n",i);     // ZEILE E Ausdruck 111 
          }
        printf("%d\n",i);       // ZEILE F Ausdruck 111 
     }

     printf("%d\n",i);           // ZEILE G Ausdruck 333 
     return 0;
}


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

Autor: SULI (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DAs eine i ist global
und das andere i ist lokal

Autor: Reisender (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Udo Scharnitzki (Firma: allround) (1udo1)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.