Forum: PC-Programmierung C Inkrement wird nicht durchgeführt


von Rüdiger Neumann (Gast)


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

von Hugo (Gast)


Lesenswert?

Rüdiger Neumann schrieb:
> b = 5 > 7 && a++;

5>7 is true
a++ auch

true und true is true=1

von user (Gast)


Lesenswert?

a++ ist POST increment, also wird erst nach der Rechnung erhöht

++a wäre PRE increment

von Markus M. (adrock)


Lesenswert?

Hi,m

Hugo liegt leider falsch. Seit wann ist 5>7 TRUE???

Andersrum wird ein Schuh draus:

Da 5>7 FALSE ist, wird der Abschnitt rechts vom && garnicht mehr 
beachtet, somit bleibt a auf dem Anfangswert (1).

Grüße
Markus

von Hunt W. (hunt_work_er)


Lesenswert?

Hugo schrieb:
> 5>7 is true

Bei mir nicht...

Vielleicht wird hier die gesamte Zeile
> b = 5 > 7 && a++;
Wegoptimiert, da b immer false also 0 ist?

von Überraschungsei (Gast)


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.

von Chris L. (kingkernel)


Lesenswert?

Sieht nach vergessenen Klammern aus
Wobei selbst da 5 immer kleiner als der wert von 7+b sein wird. Die 
Zeile wird also niemals ausgeführt, bist b irgendwann negativ wird 
(überlauf).
Ist int eingentlich signed int oder unsigned int?

: Bearbeitet durch User
von Überaschungsei (Gast)


Lesenswert?

>Sieht nach vergessenen Klammern aus

Ganz genau! Klammern kannst Du hier vergessen. :-)

von Skeptiker (Gast)


Lesenswert?

Wieso? Geht doch!

#include <stdio.h>

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

a= 2Press any key to continue...

:)

von Stefan W. (dl6dx)


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

von Rüdiger Neumann (Gast)


Lesenswert?

Ok, Danke.
die Lösung macht Sinn!

von Oha (Gast)


Lesenswert?


von Stefan R. (srand)


Lesenswert?


von Sharp dressed Man (Gast)


Lesenswert?

@Oha
Volle Zustimmung!

von rwrw (Gast)


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++;
}

von Rolf Magnus (Gast)


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/

von gnd3 (Gast)


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?

von Tüftler (Gast)


Lesenswert?

"short circuit evaluation" schimpft sich der Fachausdruck dafür

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.