C Inkrement wird nicht durchgeführt

Gast #3515169
Lesenswert?

Hallo,
ich verzweifle hier gerade bei der Prüfungsvorbereitung. Ich habe einige 
Zeilen C-Code gegeben und soll sagen, was das Programm ausgibt. Leider 
kann ich mir an einer Stelle überhaupt nicht vorstellen, warum das 
Programm das ausgibt, was es ausgibt:

int main()
{
    int a = 1, b;
    b = 5 > 7 && a++;
    printf ("a= %d", a);
}

ausgegeben wird: a = 1

Meine Frage ist nun, warum a nicht inkrementiert wird.
Kann mir das jemand erklären?
Danke schonmal für die Hilfe

Gruß
Rüdiger
Gast #3515192
Lesenswert?

> 5>7 is true

Eher nicht. Und das ist auch der Schlüssel zu dem Ergebnis a = 1. Denn 
wenn 5>7 falsch ist, dann kann die Und-Verknüpfung nie mehr wahr werden. 
Also spart sich der Compiler den Rest. Nennt sich short circuit 
evaluation. Und man lernt daraus, Post- und Predekrement und inkrement 
niemals (oder sagen wir, nur nach reichlicher Überlegung) in boolschen 
Ausdrücken zu verwenden.
#3515220
Lesenswert?

Rüdiger Neumann schrieb:
> Meine Frage ist nun, warum a nicht inkrementiert wird.

Logische Ausdrücke werden nach der Sprachdefinition von links nach 
rechts ausgewertet und die Auswertung bricht ab, sobald der Wert des 
Gesamtausdrucks feststeht. (K&R 2. Aufl. A.7.14)

Bei einer logischen Und-Verknüpfung (&&) ist der gesamte Ausdruck False, 
sobald ein Teilausdruck False ist.

Der erste Teilausdruck (5 > 7) ergibt bereits False. Die Auswertung 
bricht also an dieser Stelle ab, der Ausdruck a++ wird nie ausgeführt.

Das gilt immer und ist unabhängig von jeder möglichen 
Compileroptimierung.

Grüße

Stefan
#3515448
Lesenswert?

Gast #3516216
Lesenswert?

Zu deinem Uni Beispiel:
b = 5 > 7 && a++;
5>7 ist false
Somit braucht man erst garnicht den zweiten Teil der Und Verknüpfung 
betrachten, denn das Ergebnis wäre ohnehin false.
Da bereits zur Zeit der Programmerstellung das Ergebnis feststeht, würde 
es mich nicht wundern, wenn der Compiler hier gar noch etwas 
wegoptimiert.

Und jetzt noch ein paar Worte zur Realität:
Wenn du solchen Code in der Privatwirtschaft ablieferst, bekommst du 
sicher Probleme mit dem Abteilungsleiter oder mit der 
Qualitätsabteilung.
Nur weil man in C ziemlich viel Dinge tun kann, heißt das noch lange 
nicht, dass man es tun soll.
Das obige Beispiel sollte eigentlich so programmiert werden:
if(5>7)
{
  a++;
}
Gast #3516768
Lesenswert?

rwrw schrieb:
> Und jetzt noch ein paar Worte zur Realität:
> Wenn du solchen Code in der Privatwirtschaft ablieferst, bekommst du
> sicher Probleme mit dem Abteilungsleiter oder mit der
> Qualitätsabteilung.

Mit dem Abteilungsleiter eher nicht. Der hat entweder keine Ahnung vom 
Programmieren oder keine Zeit, in den Code zu schauen. Meistens sogar 
beides.

> Das obige Beispiel sollte eigentlich so programmiert werden:
> if(5>7)
> {
>   a++;
> }

Es geht bei diesem Beispiel nicht um schönen Code, sondern einzig darum, 
die short-cirquit evaluation zu verstehen.

Hmm, wie ich gerade festgestellt hab, wurde die wohl auch schon 
eingedeutscht:
http://de.wikipedia.org/wiki/Kurzschlussauswertung


Oha schrieb:
> 
http://www.spiegel.de/kultur/zwiebelfisch/zwiebelfisch-stop-making-sense-a-261738.html

http://www.sinn-macher.de/
Gast #3516807
Lesenswert?

rwrw schrieb:
> Nur weil man in C ziemlich viel Dinge tun kann, heißt das noch lange
> nicht, dass man es tun soll.

wohl wahr! Aber man kann es auch übertreiben, z.B. so:

> Das obige Beispiel sollte eigentlich so programmiert werden:
> if(5>7)
> {
>   a++;
> }

das erinnert mich an manche Damen aus dem Show-Geschäft: kann vor lauter 
Schönheit nicht mehr laufen :) Wo ist die Zuweisung an b geblieben?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren