Frage zur while-Schleife bzw. zur Bedingung



  • break;
    

    sollte es heisen



  • Nee, so richtig klar ist noch nix. So ähnlich stets im Buch auch. Aber ich versteh das mit der 1 nicht. Was ist denn wenn ich ne 2 eingegebne hab. Hat 1 noch ne andere Bedeutung? Was ist denn expression?



  • Mit einer 2 klappt es genausogut.
    Eine Expression ist ein Ausdruck, der sich zu einem bool auswerten lässt. Also alles, was mit den Vergleichsoperatoren zusammenhängt (=, <, >, ...) oder was sich in bool konvertieren lässt (int, char*, ...).

    Deine 2 ist ein int. Ein int wird ohne weiteres in einen bool konvertiert, genauso wie die 1. Der Grund, warum man trotzdem 1 nimmt, ist ein anderer: Es gibt das ungeschriebene Gesetz, keine "magic numbers" in den Quellcode zu setzen. Ausnahme sind 0 und 1.
    Zum Beispiel ist es ganz schlecht, Zahlen wie 42 oder 163 als Arraygröße zu nehmen. Jeder Leser des Codes fragt sich sofort: "Warum steht da 42 und nicht 51? 😕 "



  • expression ist die "Bedingung", die gelten soll, solange die Schleife läuft. Das ist ähnlich wie mit "if".

    while (1) {...}
    

    Soll also heißen: Solange "1" gilt/gibt, die Schleife durchführen. Selbstverständlich kannst du auch

    while (2) {...}
    

    schreiben. Die Möglichkeit mit der eins hat sich nuneinmal so eingebürgert.

    Alles klar?
    flyingCoder.



  • Ja leuchtet ein... Aber theoretisch könnte man jede Zahl als Bedingung nehmen, und es wäre immer ne Endlosschleife?



  • @cd9000: Hätte ich nur mal etwas früher auf "absenden" gedrückt ...



  • Olliwer schrieb:

    Ja leuchtet ein... Aber theoretisch könnte man jede Zahl als Bedingung nehmen, und es wäre immer ne Endlosschleife?

    Ja.
    Noch eine verbreitete Möglichkeit ist:

    for(;;)  {...}
    


  • Achso, bei for geht das nicht mit den Zahlen oder ist es da halt nur so üblich mit (;;)



  • Olliwer schrieb:

    Achso, bei for geht das nicht mit den Zahlen oder ist es da halt nur so üblich mit (;;)

    Nein nein nein 🙂 🙂 . Bei "for" gibt es ja drei Anweisungen, die du jeweils mit ";" abschließt. Wenn man keine Anweisungen macht, schreibt man trotzdem ein ";". Kennst du sicherlich von

    do
    {
        ...
    } while (...)
        ; /* <-- */
    

    Kleines Beispiel:

    for (i=0;;i++) {
        getchar();
        if (i >= 10)
            break;
    }
    printf("Sie haben 10x auf Enter gedrueckt");
    

    Im Prinzip auch eine Endlosschleife.
    Lange Rede, kurzer Sinn. Bei for (;; ) macht man keine Anweisungen/Bedingungen. Also läuft die Schleife - auf den ersten Blick - bis zum "Sankt Nimmerleinstag".

    Hoffe, ich habe dich nicht verwirrt; flyingCoder.



  • @olliwer,
    man kann die Bedingung noch etwas eingrenzen.
    So erreichst du, daß nur bei Eingabe von 1 das Programm vortgesetzt
    und ansonsten die Schleife verlassen wird.

    #include <stdio.h>
    
    int main()
    {
        int eingabe = 0;
    
        while(eingabe = 1)
        {
            printf("Bitte geben Sie eine Ganzzahl ein : ");
            scanf("%d",&eingabe);
            //Wenn eingabe 0 oder größer, gleich 2, dann verlasse die Schleife
            if((eingabe == 0) || (eingabe >= 2))
                break;
        }
        printf("Sie sind raus aus der Schleife!!\n");
    
        getch();
        return 0;
    }
    


  • @azoikum:

    du hast bei deiner while bedingung = geschrieben, es muss aber == heißen, weil es ja ein vergleich ist. war warscheinlich nur ein leichsinnsfehler, kann aber einem "ungeübten auge" ziemlich probleme bereiten.



  • Die while-Bedingung checkt einfach nur ab, ob der Ausdruck in der Klammer wahr oder falsch ist (Binär 1 oder 0) 😮 . Jeder Ausdruck ungleich 0 wird somit als wahr gedeutet. Da 1 immer wahr ist, läuft die Schleife endlos. Einzig die break-Anweisung bewirkt, dass die Schleife verlassen werden kann. Theoretisch kannst du aber jeden Wert ungleich 0 reinschreiben und es wird als wahr gewertet. Klaro? 🙂



  • Hi zoppe,
    erstmal danke für das Feetback.
    Probiere das Programm bitte mal mit "== im while" aus.

    Gruß azoikum.


Anmelden zum Antworten