Verstehe ich nicht: for-Schleife



  • Hallo zusammen,

    ich habe ein Verständnisproblem mit dem folgenden Programm:

    #include <iostream>
    using namespace std;
    
    int main()
    {
    	int i, j;
    	for (i=0; i<=100; i++)
    	{
    		for (j=1000; j>0; j--)
    		{
    			if (i==50 && j==999)
    				goto ende;
    		}
    	}
    	ende:
    		cout << "\nProgramm wurde beendet mit ";
    		cout <<"i = " << i << " und j = " << j;
    		return 0;
    }
    

    Das Programm endet mit der Ausgabe:

    Programm wurde beendet mit i = 50 und j = 999
    

    Warum?! Wenn ich das richtig sehe gibt es eine äußere und eine innere for-Schleife...
    Die äußere Schleife wird in diesem Programm offenbar tatsächlich 50 mal durchlaufen.
    Wieso ist aber j aus der inneren Schleife dann 999? Wieso ist die innere Schleife nur 1 mal durchgelaufen?


  • Mod

    Weil das ein wunderbares Beispiel für Spaghetticode ist. Das goto verlässt die Schleife vorzeitig. Lass dir das eine Lehre sein, warum man solche Konstrukte vermeiden sollte.



  • Ja, das ist mir klar. Ich verwende hier ein Beispiel aus einem Buch...

    Ich verstehe es dennoch nicht. Die Schleife wird verlassen wenn die Abbruchbedinung eintritt (i=50 && j=999). Aber egal wie ich es betrachte. Ich verstehe nicht wieso i = 50 sein soll wenn j = 999 erreicht. Wie geht das?



  • Wenn i=1 ist, wird die innere Schleife durchlaufen von j=1000 bis 1. Wenn das geschehen ist, wird i um eins erhöht.

    lG Mentras



  • Wolfsherz schrieb:

    Ja, das ist mir klar. Ich verwende hier ein Beispiel aus einem Buch...

    Ich verstehe es dennoch nicht. Die Schleife wird verlassen wenn die Abbruchbedinung eintritt (i=50 && j=999). Aber egal wie ich es betrachte. Ich verstehe nicht wieso i = 50 sein soll wenn j = 999 erreicht. Wie geht das?

    kopier doch spaßeshalber die ausgabe:

    cout <<"i = " << i << " und j = " << j;
    

    mal über den goto ende; befehl in deine Schleife...
    Dann siehste doch, was passiert. 🙂



  • @Mentras & Lupo4u2:

    Danke! Jetzt habe ich es verstanden. Ich nahm an, dass er die innere Schleife genau einmal ausführt und dann erneut außen anfängt... Mein Fehler!



  • Wolfsherz schrieb:

    Ich verstehe es dennoch nicht. Die Schleife wird verlassen wenn die Abbruchbedinung eintritt (i=50 && j=999). Aber egal wie ich es betrachte. Ich verstehe nicht wieso i = 50 sein soll wenn j = 999 erreicht. Wie geht das?

    Die innere Schleife wird 51 mal aufgerufen (mit insgesammt etwa 50002 Durchläufen).

    for(int i=0; i<=100; i++)
    {
      for (int j=1000; j>0; j--)
      {
        if (i==50 && j==999)
          goto ende; // brrrrrrr...
      }
    }
    

    Also spielen wir dies mal durch...

    * Die Äußere Schleife wird betreten (i=0).
    * Nun wird die Innere Schleife einmal (bei i=0) ausgeführt
    (und zwar im Bereich von j 1000 bis j 1 => 1000 Durchläufe).
    * [Dies wiederholt sich nun für i 0..49]
    * Die Äußere Schleife wird betreten (i=50)
    * Nun wird die Innere Schleife einmal ausgeführt
    * Im ersten Durchlauf ist j==1000
    * Im zweiten Durchlauf ist j== 999 => goto



  • das hat mich jetzt zum Anfang auch einmal irritiert.
    blöd gemacht, vor allem so sinnlos, aber als Beispiel...
    btw: Wofür eig, for schleifen ?

    EDIT: break; wär 1000 mal besser



  • Tim06TR schrieb:

    btw: Wofür eig, for schleifen ?

    Warum denn nicht?



  • Tim06TR schrieb:

    btw: Wofür eig, for schleifen ?

    die existenz besteht auch aus einer ewigen schleife. ohne die schleife wäre alles starr



  • und abermals falsch verstanden ich meinte nicht wozu for-Schleifen sondern,
    wozu das Beispiel aus dem Buch sei: for-Schleifen ?
    Na jetzt ? Münze pling -> Schlecht ausgedrückt -> Tob Zeter -> Ausrede meinerseits
    😃



  • Ich weiß ich bin etwas wirr im Kopf, das kommt vom C++ Programmieren



  • Das Programm soll nur die Anwendung von Goto demonstrieren. Es wird klar darauf hingewiesen, dass man Goto normalerweise stets vermeiden kann (und meiner Meinung nach sollte).
    Ich hatte eben Schwierigkeiten zu verstehen wie diese zwei for-Schleifen abgearbeitet werden.


Log in to reply