Bestimme und erkläre die Bildschirmausgaben des nachstehenden Programms



  • Hallo,
    Ich komme einfach auf das Programm nicht klar! Ich hoffe ihr könnt mir helfen warum die Werte zustande kommen! Mfg Oliver

    Wert von 7||(y==0): 1
    Wert von y: 5

    erg = 1, a = 1, b = 0, c = 0
    erg = 1, a = 1, b = 1, c = 0

    #include < stdio.h >
    int main() {
    int erg, a, b, c;
    int y=5;
    printf("Wert von 7||(y==0): %d\n",7||(y==0));
    printf("Wert von y: %d\n\n",y);
    a = b = c = 0;
    erg = ++a || ++b && ++c;
    printf("erg = %d, a = %d, b = %d, c = %d\n", erg, a, b, c);
    a = b = c = 0;
    erg = ++a && ++b || ++c;
    printf("erg = %d, a = %d, b = %d, c = %d\n", erg, a, b, c);
    return 0;
    }



  • 0 ist unwahr, falsch
    ungleich 0 ist wahr, richtig
    !0 ergibt 1

    || ist das logische oder
    && ist das logische und

    ++a ist das preincrement (a wird vor der Nutzung erhöht)
    Achtung Kommentare

    #include < stdio.h >
    int main() {
    int erg, a, b, c;
    int y=5;
    printf("Wert von 7||(y==0): %d\n",7||(y==0));  // wahr oder unwahr -> wahr
    printf("Wert von y: %d\n\n",y);
    a = b = c = 0;
    erg = ++a || ++b && ++c;                      // 1 oder 0 und 0  -> 1  
    // Der Zustand von b und c spielt keine Rolle mehr
    printf("erg = %d, a = %d, b = %d, c = %d\n", erg, a, b, c);
    a = b = c = 0;
    erg = ++a && ++b || ++c;                      // 1 und 1 oder 0  -> 1
    // Der Zustand von  c spielt keine Rolle mehr
    printf("erg = %d, a = %d, b = %d, c = %d\n", erg, a, b, c);
    return 0;
    }
    

    ⚠ Wenn die Bedingungen erfüllt sind braucht C nicht mehr weiterrechnen.



  • Soll das ein Lehrprogramm zur Vorrangregelung von logischen Operatoren in C sein? Es gibt besseres.
    Aus Logiksicht gilt für C:

    gleich Null -> wird ausgewertet zu False
    ungleich Null -> wird ausgewertet zu True

    Zusätzlich gibt es in C die Kurzschlussauswertung, d.h. wenn für das Gesamtergebnis die Auswertung des Partnerausdrucks neben dem Logikoperator nicht mehr notwendig ist, wird dieser Ausdruck auch nicht mehr ausgewertet, d.h.
    bei Oder wird der folgende Ausdruck nicht ausgewertet, falls der aktuelle Ausdruck schon True ist, bei Und wird der folgende Ausdruck nicht mehr ausgewertet, falls der aktuelle False ist.
    Anders sieht das natürlich bei den Binäroperatoren & und | aus, die man auch für logische Auswertungen benutzen kann.


  • Mod

    DirkB schrieb:

    ⚠ Wenn die Bedingungen erfüllt sind braucht C nicht mehr weiterrechnen.

    ⚠ Wenn die Bedingungen erfüllt sind darf C nicht mehr weiterrechnen.



  • SeppJ schrieb:

    DirkB schrieb:

    ⚠ Wenn die Bedingungen erfüllt sind braucht C nicht mehr weiterrechnen.

    ⚠ Wenn die Bedingungen erfüllt sind darf C nicht mehr weiterrechnen.

    Würde mich gerade sogar wirklich interessieren. Steht im Standard explizit dass

    int f1()
    {
      return 0;
    }
    int f2()
    {
      return 1;
    }
    int main()
    {
      if (f1() && f2())
        ..
      ..
    }
    

    hier die zweite Funktion nie ausgeführt wird?



  • Ok, C99 bestimmt

    Unlike the bitwise binary & operator, the && operator guarantees left-to-right evaluation;
    there is a sequence point after the evaluation of the first operand. If the first operand
    compares equal to 0, the second operand is not evaluated.

    Wie das mit C89 aussieht weis ich nicht..


  • Mod

    Meinst du das verbessere ich zum Spaß, wenn es nicht so wäre?



  • Nein, aber das fette darf war etwas verwirrend. Hätte ja auch das "Dürfen" im Gegensatz zum "Müssen" hervorheben können..
    Ich wollte halt nur sicher wissen ob ich das jetzt richtig verstanden habe, das wäre sonst nicht gut für mein Programm gewesen 😃



  • cooky451 schrieb:

    Ok, C99 bestimmt

    Unlike the bitwise binary & operator, the && operator guarantees left-to-right evaluation;
    there is a sequence point after the evaluation of the first operand. If the first operand
    compares equal to 0, the second operand is not evaluated.

    Wie das mit C89 aussieht weis ich nicht..

    hab das aus dem K&R Buch auch so in Erinnerung, also wohl keine C99 Neuheit, sondern schon in C89 so definiert 🙂



  • Danke für die schnellen Antworten
    🙂 🙂 🙂


Anmelden zum Antworten