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 OliverWert von 7||(y==0): 1
Wert von y: 5erg = 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 TrueZusä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.
-
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..
-
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