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
a++ ist POST increment, also wird erst nach der Rechnung erhöht ++a wäre PRE increment
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
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?
> 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.
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
>Sieht nach vergessenen Klammern aus
Ganz genau! Klammern kannst Du hier vergessen. :-)
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... :)
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
Gut gemacht, Oha! Nichts zum Thema beizutragen, aber off-topic stänkern. Blöderweise hast du auch noch Unrecht, was kein Wunder ist, wenn du Sick zitierst. Guck doch mal, was echte Linguisten dazu sagen: http://www.iaas.uni-bremen.de/sprachblog/2007/10/01/sinnesfreuden-i/index.html http://www.iaas.uni-bremen.de/sprachblog/2007/10/08/sinnesfreuden-ii/index.html http://www.iaas.uni-bremen.de/sprachblog/2007/10/15/sinnesfreuden-iii/index.html http://www.iaas.uni-bremen.de/sprachblog/2007/10/22/sinnesfreuden-iv/index.html http://www.iaas.uni-bremen.de/sprachblog/2007/11/01/sinnesfreuden-v/index.html http://www.iaas.uni-bremen.de/sprachblog/2009/01/12/seit-wann-machen-wir-im-deutschen-sinn/
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++; }
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/
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?
"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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.