Frage zur while-Schleife bzw. zur Bedingung



  • /* Demonstration von break */
    #include <stdio.h>
    Hallo und n frohes neues...Ich hab ne Frage zur folgenden Aufgabe aus nem Buch über C. Soweit ist alles klar. Ich versteh nur nicht wieso bei der Bedingung (1) für while der Anweisungsblock bei jeder Eingabe außer der 0 wiederholt wird. Wenn ich eine 2 eingebe ist es doch keine 1. Versteh ich nicht.
    int main()

    {

    int eingabe;

    while(1)
    {
    printf("Bitte geben Sie eine Ganzzahl ein : ");
    scanf("%d",&eingabe);
    if(eingabe==0)
    break;
    }
    printf("Sie sind raus aus der Schleife!!\n");
    return 0;
    }



  • int main() 
    
    { 
    
    int eingabe; 
    
    while(1) 
    { 
    printf("Bitte geben Sie eine Ganzzahl ein : "); 
    scanf("%d",&eingabe); 
    if(eingabe==0) 
    break; 
    } 
    printf("Sie sind raus aus der Schleife!!\n"); 
    return 0; 
    }
    

    jo.. also mit

    while(expression) {
    ....
    }
    und expression = 1 hast de dir ne endlosschleife gebastelt, die
    via

    if(eigabe == 0)
    

    mit der davon eingeleiteten Operation
    [code]break;[code]
    verlassen wird.

    Alles klar?



  • 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