while Schleifen



  • Vielen Dank für die schnelle Antwort! 🙂

    Ich merke mir:

    i++, i <=10
    

    ist grundsätzlich eine ungewöhnliche Schreibweise und mache es künftig dann im Schleifen-Körper.

    Danke!

    Gestatte mir aber bitte eine Nachfrage:
    Selbst wenn der Letzte Eintrag im Schleifen-Kopf als Gesamtausdruck verwendet wird, wird die Schleife an dieser Stelle doch erst einmal begonnen, oder? Und sie wird dann nach ihrem Durchlauf doch wieder einmal ganz im Kopf durchlaufen, oder?



  • cStart schrieb:

    Wenn ich den Code wie folgt verändere:

    while(i =10){
    	printf("Zahl: %i\n", i);
        i++; }
    

    erhalte ich eine Endlosschleife mit dem Wert 10.

    Das '=' ist der Zuweisungsoperator und das '==' ist der Vergleichsoperator. Du wolltest wohl

    while ( i == 10 ) { /* ... */ }
    

    Allerdings ist der Code dann nicht wirklich sinnvoll 😉

    Grundsaetzlich gilt: Ganzzahlen ueberprueft man auf Gleicheit man mit '==' und nicht mit '='



  • Ja, der Vergleichsoperator ist mir bekannt. Ich habe trotzdem damit gerechnet, dass die Schleife durchlaufen wird und mir nur die 10 ausgegeben wird. Denn ich nahm an, dass ich ihr sage: Durchlaufe die Schleife, wie i = 10 ist. Und i ist ja auch genau einmal 10. Dann sollte es durch i++ ja auf 11 gesetzt werden. Entsprechend überrascht war ich, als ich dann nur 10er hatte.



  • Ah, moment... 🙂
    Wenn ich im Kopf sage:

    i++, i =10
    

    dann kann ich i noch so weit nach oben zählen. Denn dadurch, dass das i=10 die letzte Anweisung im Kopf ist, setze ich die Variable vor den Sprung in die Schleife immer auf 10. Dann ist ja klar, dass ich nur 10er bekomme... Sorry, das hätte ich wissen müssen! 🙄



  • cStart schrieb:

    Ja, der Vergleichsoperator ist mir bekannt. Ich habe trotzdem damit gerechnet, dass die Schleife durchlaufen wird und mir nur die 10 ausgegeben wird. Denn ich nahm an, dass ich ihr sage: Durchlaufe die Schleife, wie i = 10 ist. Und i ist ja auch genau einmal 10. Dann sollte es durch i++ ja auf 11 gesetzt werden. Entsprechend überrascht war ich, als ich dann nur 10er hatte.

    Falls der Grund noch nicht klar ist hier eine kurze Erklaerung. Das Programm macht im Prinzip folgendes:

    - while ( i = 10 ) // i wird auf 10 gesetzt und der Ausdruck selber ist 10, was als true interpretiert wird
    - print(i) // Hier wird 10 ausgegeben
    - i++; // i wird auf 11 gesetzt
    - while ( i = 10 ) // i wird auf 10 gesetzt und der Ausdruck selber ist 10, wa als true interpretiert wird
    - print(i) // Hier wird 10 ausgegeben
    - i++; // i wird auf 11 gesetzt
    - ...
    - ...

    Den Rest kannst du dir denken... Endlosschleife und es wird immer 10 ausgegeben 😉



  • Jo, da liegt das Problem. Dein Wink mit dem Zuweisungsoperator hat mir geholfen. Dann habe ich erst erkannt, was ich da unsinniges angestellt habe. 🙂 Wie gesagt, das hätte ich nun wirklich wissen können. Sorry.

    DANKE!


  • Mod

    cStart schrieb:

    Vielen Dank für die schnelle Antwort! 🙂

    Ich merke mir:

    i++, i <=10
    

    ist grundsätzlich eine ungewöhnliche Schreibweise und mache es künftig dann im Schleifen-Körper.

    Praktischer ist da die for-Schleife, die sicherlich als nächstes oder übernächstes drankommt. Die fasst das alles recht übersichtlich zusammen und ist somit ideal für die sehr häufig vorkommenden Zählschleifen (aber auch für vieles andere mehr!).

    P.S.: Und noch eine sehr, sehr allgemeine Bemerkung:
    Es ist üblicher, bei Schleifen von einer unteren, inklusiven Grenze aus bis zu einer oberen, exklusiven Grenze zu gehen, in Intervallschreibweise:
    [untere grenze, obere grenze)
    Dies hat folgende Vorteile:
    -Das Intervall kann auch leer sein
    -Man kann die Menge der Zahlen im Intervall direkt als (obere Grenze - untere Grenze) ablesen.
    In C-Schreibweise wäre das

    int i = untere_grenze;
    while (i < obere_grenze) ...    // oder auch besser mit for.
    


  • Diese Praxis beruht aber darauf, dass in C die untere Grenze meist 0 ist.
    Man kann also bequem die Anzahl der Durchläufe erkennen.

    Wenn ich aber die Werte von der Schleifenvariablen/-zähler haben will und diese nicht bei 0 anfangen, kann man auch die obere Grenze einschließen.
    Dann sieht man gleich, ohne Rechnung, die Endwerte.



  • Vielen Dank für eure hilfreichen Hinweise! 🙂


  • Mod

    DirkB schrieb:

    Wenn ich aber die Werte von der Schleifenvariablen/-zähler haben will und diese nicht bei 0 anfangen, kann man auch die obere Grenze einschließen.
    Dann sieht man gleich, ohne Rechnung, die Endwerte.

    Dann hast du aber gerade die beiden genannten Vorteile nicht mehr. Sei U die untere und O die obere Grenze:
    -Anzahl der Durchläufe ist nun O-U+1. Unintuitiv.
    -Damit Anzahl der Durchläufe 0 ist, muss O<U sein. Unintuitiv. Oder gar unmöglich, wenn man unsigned ab 0 hochzählen möchte.

    Im Fall, dass man ab 0 zählt, ist der Punkt

    -Man kann die Menge der Zahlen im Intervall direkt als (obere Grenze - untere Grenze) ablesen.

    halt noch doppelt vorteilhaft. Gilt aber trotzdem noch, auch wenn man ab 1 zählt.

    Ganz schlecht wäre hingegen eine Mischung der beiden Stile, wenn du nun einwenden solltest, dass man, wenn U > 0, die obere Grenze einschließen könnt und bei U = 0 eben nicht. Dann hinge die Lesbarkeit des Codes nämlich von Details des Vergleichsoperators ab und man müsste jedes Mal ganz genau hingucken.



  • In komplizierteren Fällen könnte sich mit while eine Endlosschleife im Kopf und ein Abbruch im Rumpf lohnen. Etwa so:

    int i = 0;
    int max = 20;
    while (1 < 2)
    {
       if(i > max) break;
       ......
       i++;
    }
    

    So mache ich in der Testphase das Prüfen einer Iteration, wenn das Abbruchkriterium mir noch nicht ganz sicher ist.



  • SeppJ schrieb:

    ... und man müsste jedes Mal ganz genau hingucken.

    Das muss man sowieso. 😉



  • Bei while (1 < 2) muss man doch überlegen.
    Ein while (1) ist gleich als Endlosschleife erkennbar.



  • Mich verunsichert, dass ich euch noch nicht lückenlos folgen kann... Muss ich mir Sorgen machen und Teile wiederholen? 😕


  • Mod

    cStart schrieb:

    Mich verunsichert, dass ich euch noch nicht lückenlos folgen kann... Muss ich mir Sorgen machen und Teile wiederholen? 😕

    Nein, dies sind eher Feinheiten von fortgeschrittenen Stilfragen. Wir missbrauchen hier schamlos deinen Thread für die Diskussion, weil das Thema in die Richtung schwenkte. Deine eigentliche Frage sollte beantwortet sein, oder?



  • Ja, das ist sie! Danke!
    So tobt euch weiter aus! 🙂

    Abschließend noch eine Frage, die auch gar nichts hiermit zu tun hat:
    Ich kann über die Uni kostenfrei MS Visual Studio 2012 Ultimate bekommen. Kann ich damit auch in C programmieren. Ich habe versucht diesbezüglich Informationen zu erhalten. Leider waren die nicht eindeutig. Danke!


  • Mod

    Der Standardcompiler vom VS kann auch C, aber nur C89. Die IDE kann man leider wohl nicht auf C umstellen, die ist immer im C++-Modus. Insgesamt mag Microsoft C wohl nicht sehr gerne 😉 .
    Ob das für dich genügend Gründe gegen VS sind musst du selber wissen. VS gilt ansonsten als eine exzellente Entwicklungsumgebung.

    Weiterhin: Die Ultimateversion von VS ist etwas, das wirst du niemals ausnutzen. Die Expressversion, die für reines Hobbyprogrammieren mehr als ausreichend ist, ist ohnehin kostenlos. Ultimate ist die Version für das allerprofessionellste Umfeld; für Unternehmen mit Hunderten oder Tausenden Programmierern, die gleichzeitig an einem Millionen-Dollar Projekt arbeiten.



  • Also dass ich den Umfang der Software niemals ausnutzen werde, stelle ich keineswegs in Frage! 🙂 Ich wollte die Möglichkeit jedoch nicht verschenken und mich deswegen mal schlau machen. Fazit: Finger weg und weiter mit VS 2010 Express üben und arbeiten. Danke.


  • Mod

    VS2010 ist bezüglich C ziemlich das gleiche wie VS2012. Die C-Unterstützung wurde nie wirklich gepflegt.



  • Microsoft bringt ca. alle drei Jahre ein neues VS raus. Überleg dir selber, wann du die Möglichkeiten von VS 2012 Ultimate nutzen kannst und wie veraltet es dann ist. 😉


Anmelden zum Antworten