increment Operator Auswahl?
-
Hallo,
Warum wird bei dem Ausdruck:
c=a+++b;
zuerst a um eins erhöht
und nicht b ?Wenn ich für a = 2 und b = 3 einsetzte erhalte ich c = 5
Irgendwie verstehe ich das nicht, denn es könnte ja auch zuerst b erhöht
werden was dan als ergebnis 6 hätte.An den Vorrangregeln kann es ja nicht liegen, Wenn der Kompiler meint es handele
sich um zwei ++ Operatoren müßte er ja von R->L bewerten also erst ++bMit leerraumzeichen habe ich keine Verständnisprobleme
Könnte mir das jemand erklären?mfg
Josef
-
Ich nehme an, das ist so, weil der Postincrement Operator eine höhere Priorität hat, als die Preinc Version.
-
DerKuchen schrieb:
Ich nehme an, das ist so, weil der Postincrement Operator eine höhere Priorität hat, als die Preinc Version.
Der C99 Standard gibt aber keine Unterscheidung zwischen der priorität
von postfix increment operator und prefix increment operator an, Alle liegen
in der gleichen Rangfolge und die Assoziativität ist R->L.Wie könnte ich das testen?
a++ - ++a
gibt mir die Warnung: Operation on 'a' may be undefined.
und bei
a++ - ++b
ist die tatsächliche Reihenfolge nicht ersichtlich.
-
der compiler nimmt sich so viel, wie er kriegen kann. bei a+++ erkennt er zuerst ein a++ und nach dem nächsten + erwartet er nen zweiten operanden.
-
osef schrieb:
a++ - ++a
gibt mir die Warnung: Operation on 'a' may be undefined.
Pro Anweisung darf eine Variable afair nur einmal verändert werden, daher die Warnung.
osef schrieb:
und bei
a++ - ++b
ist die tatsächliche Reihenfolge nicht ersichtlich.
Der Postincrement-Operator erhöht den Operanden afaik erst nach der Anweisung, d.h. der hat hier erstmal gar keine Relevanz.
D.h. man könnte das ganze auch so hier schreiben:
a - ++b; a++;
-
Richtig, aber der Compiler wertet das Statement von links nach rechts aus, er sieht a, dann ++ und sieht, dass danach >ein< + kommt, somit fast er a++ als ersten Operand und b als zweiten Operand auf.
-
So etwas schreibe ich einzeln.
Soll sich der Compiler um die Optimierung kümmern. Der kann das und ich muß
mir darüber keinen Kopf machen.
-
osef schrieb:
DerKuchen schrieb:
Ich nehme an, das ist so, weil der Postincrement Operator eine höhere Priorität hat, als die Preinc Version.
Der C99 Standard gibt aber keine Unterscheidung zwischen der priorität
von postfix increment operator und prefix increment operator an, Alle liegen
in der gleichen Rangfolge und die Assoziativität ist R->L.Dann hab ich einen Fehler auf http://cppreference.com/operator_precedence.html gefunden!
Es könnte auch daran liegen, dass der Parser einfach von vorne nach hinten arbeitet. Mit solchen Dingen hab ich mich bisher nicht beschäftigt, aber ich kann mir vorstellen, dass a++ die größtmögliche, vollständige Sequenz ist, die der Parser verarbeiten kann. Wenn es nicht festgelegt ist, würde ich sowieso nicht benutzen, sowas bringt nur Kopfschmerzen.
-
c=a+++b;
Könnte bedeuten:
c = (a++) + (b); c = (a) + (++b);
Ähem - warum so etwas schreiben ?
Durch eine Klammerung wäre das etwas klarer ...
-
DerKuchen schrieb:
Dann hab ich einen Fehler auf http://cppreference.com/operator_precedence.html gefunden!
Das muss kein fehler sein der Link bezieht sich ja auf C++, also das
incrementierte (verbessertes) C. Ich habe den C99 Standard auch nicht (vllt.
möchte jemand seinen mir verkaufenmeine Information habe ich von url=http://www.schellong.de/c.htm#oper]Helmut Schellong[/url]
Es könnte auch daran liegen, dass der Parser einfach von vorne nach hinten arbeitet. Mit solchen Dingen hab ich mich bisher nicht beschäftigt, aber ich kann mir vorstellen, dass a++ die größtmögliche, vollständige Sequenz ist, die der Parser verarbeiten kann. Wenn es nicht festgelegt ist, würde ich sowieso nicht benutzen, sowas bringt nur Kopfschmerzen.[/quote]
-
osef schrieb:
Ich habe den C99 Standard auch nicht (vllt.
möchte jemand seinen mir verkaufenkaufen muss man sowas nicht.
http://www.myjavaserver.com/~pittbull/n843.pdf
-
Scheppertreiber schrieb:
c=a+++b;
Könnte bedeuten:
c = (a++) + (b); c = (a) + (++b);
Ähem - warum so etwas schreiben ?
Durch eine Klammerung wäre das etwas klarer ...Ich könnte dich ja auch fragen: Warum eine Ural fahren?
Antwort: Weil es syntaktisch richtig ist.Bei so einfachen Ausdrücken finde ich Klammern eher
komplizierter.c=a+b; /* für die erste Version */ c=a + ++b; /* für die Zweite Version was eigentlich gleich wäre wie c=a+++b
mfg
Josef
-
osef schrieb:
c=a + ++b; /* für die Zweite Version was eigentlich gleich wäre wie c=a+++b
ich würde es lieber so schreiben:
b++; c = a+b;