Frage zu While Ausdruck in C

  • C

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    Frage zu While Ausdruck in C

    Hallo,

    ich habe von meinem Sohn einen Codeschnipsel aus einem Buch vorgelegt bekommen, den er nicht versteht und mich um Hilfe gebeten.
    Leider kann ich ihm da auch nicht weiterhelfen und wäre sehr dankbar wenn mir hier jemand weiterhelfen kann.

    Es geht um folgenden Code:

    ...

    Quellcode

    1. long val = n;
    2. while(--val) {
    3. n*=val;
    4. }
    5. return n;


    Für mich unverständlich ist der while Ausdruck. Wie und wann soll hier der Schleifenausdruck ausgelöst werden?
    Oder handelt es sich hier einfach um einen Druckfehler?

    Vielen Dank im voraus für Eure Hilfe

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    In C ist alles true, was nicht 0 ist. Heißt also quasi, dass die Variable solange dekrementiert wird, bis sie 0 ist und dann die Schleifenbedingung false ist.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    @Trade

    musst es vielleicht noch genauer beschreiben.

    C-Quellcode

    1. while(--val)


    Bei jedem Schleifendurchgang wird die Variable val um 1 runtergezählt.
    Solange also val nicht den Wert 0 hat, wird es als True gewertet, und die Schleife wird nicht verlassen.
    Bei 0 ist val = False und die While-Schleife wird verlassen.

    Freundliche Grüsse

    exc-jdbi
    Man beachte aber den Unterschied zwischen --val und val--.
    --val hat diese Reihenfolge: Verringere val um 1, evaluiere zu val.
    val-- hat diese Reihenfolge: Evaluiere zu val, verringere val um 1.

    Also angenommen, val hat vorher den Wert 1, dann kommt folgendes raus:
    --val: Verringere val um 1 (also auf 0), evaluiere zu val (also 0).
    val--: Evaluiere zu val (also 1), verringere val um 1 (also 0).

    --val heißt "pre-decrement", also "vorher verringern".
    val-- heißt "post-decrement", also "nachher verringern".

    Die Schleife im Startpost macht also keinen Durchlauf mit val = 0, weil zuerst auf 0 verringert wird und dann die resultierende 0 von while auf != 0 geprüft wird. Das ist wichtig, denn sonst würde n irgendwann mal mit 0 multipliziert werden, was sicher nicht Sinn der Sache war.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils