• Das kreative Thema des Monats Oktober wird vor allem diejenigen unter Euch besonders ansprechen, denen Do-it-yourself quasi im Blut liegt. Zeigt uns Eure Improvisationskünste oder fotografiert, was andere Leute sich so im Alltag zusammengestrickt haben. --> Zum Mitmachen bitte hier klicken

Variable ausserhalb einer Schleife weiterverwenden

ceera

Golden Delicious
Registriert
15.11.10
Beiträge
6
Hi zusammen
Ich habe kürzlich begonnen mich mit Objective-C auseinanderzusetzen. Nach einigem Studium des ganzen Objekt, Methoden, usw. Prinzips habe ich dann einfach mal losgelegt. Doch ich bin auf Problem gestossen, auf dessen Lösung ich auch nach einigen Stunden Recherche nicht gekommen bin. Wie kann man eine Variable, die man innerhalb einer Schleife (oder allgemein eines Scoops) verändert hat, ausserhalb der Schleife weiterverwenden?
Hier ein einfaches, recht sinnfreies Bespiel:
Code:
double zahl1 = 0
double zahl2 = 5;
while (zahl1<20)
{
double zahl2 = zahl2*zahl1;
++zahl1;
}
NSLog(@"Produkt %f", zahl2);
zahl2 wird in der Schleife laufend verändert, doch wenn die Schleife beendet ist, nimmt zahl2 wieder den anfänglichen Wert (5) an. Wie kann ich die letzteDefinition von zahl2 innerhalb des Loops auch ausserhalb verwenden?
Vielen Dank im Voraus
 
Du musst die Variable außerhalb der Funktion definieren, dann ist die auch außerhalb zugreifbar. Oder einfach die Variable von der Methode zurückgeben lassen (eleganter).
 
Oh der Fehler fällt mir erst jetzt auf… Du erstellst ja in der Schleife eine neue Variable, was wie gesagt auch nicht unbedingt erlaubt sein sollte.
 
So etwas erlaubt der Compiler? :-o
Natürlich erlaubt der Compiler sowas, es handelt sich hierbei um 2 unterschiedliche Variablen. Zwar mit dem selben Namen, jedoch mit einem anderen Scope, und somit "verdeckt" die innerhalb der Schleife definierte Variable "zahl2" die außerhalb definierte. Nicht gerade schlau sowas zu machen, aber aus syntaktischer Sicht korrekt.

Generell verlieren Variablen, welche innerhalb eines Blockes (also innerhalb von geschwungenen Klammern) definiert werden, bei der schließenden Klammer (also am Ende des Blockes) ihre Gültigkeit, egal ob der Block ein if, eine Schleife, eine Funktion oder auch einfach nur ein Block aus Klammern ist.

Aufgabe zum Nachdenken, was gibt dieser Code aus (in c geschrieben):
Code:
main()
{
  int test = 3;
  {     
    int test = 4;
    printf("%d\n",test);
  }
  printf("%d\n",test);
  return 0;
}
Und was dieser?
Code:
main()
{
  int test = 3;
  {     
    test = 4;
    printf("%d\n",test);
  }
  printf("%d\n",test);
  return 0;
}
 
Natürlich erlaubt der Compiler sowas, es handelt sich hierbei um 2 unterschiedliche Variablen.

Naja, ganz so „natürlich“ ist das nicht ;-)
In Java z.B. ist so das nicht erlaubt/compilierbar – vermutlich nur, um solche Programmierfehler wie hier zu vermeiden, denn einen technischen Grund für die Verweigerung sehe ich nicht.
 
Vielen Dank für die schnellen Antworten. Ich habe in der zwischenzeit selber herausgefunden, an was es liegt: In der Schleife selbst darf man die Variabel nicht mehr neu deklarieren, sonst erstellt man eine neue, unabhängige Variabel, die nur in der Schleife existiert. Eigentlich genau was the_mike beschrieben hat:
Aufgabe zum Nachdenken, was gibt dieser Code aus (in c geschrieben):
Code:
main()
{
  int test = 3;
  {     
    int test = 4;
    printf("%d\n",test);
  }
  printf("%d\n",test);
  return 0;
}
Und was dieser?
Code:
main()
{
  int test = 3;
  {     
    test = 4;
    printf("%d\n",test);
  }
  printf("%d\n",test);
  return 0;
}