Operator Assoziativität von Operatoren in C speziell Präfix-und postfix-Inkrement-und Dekrement -
Im C-Betrieb wird die Assoziativität ist als solche für Inkrement -, Dekrement-und Zuordnung.
2. postfix ++ and --
3. prefix ++ and --
16. Direct assignment =
Die vollständige Liste ist hier zu finden Wikipedia Operatoren in C
Meine Frage ist, wenn wir
int a, b;
b = 1;
a = b++;
printf("%d", a); //a is equal to 1
b = 1;
a = ++b;
printf("%d", a); //a is equal to 2
Warum ist a gleich 1, b++, wenn der postfix-Inkrement-operator sollte passieren, bevor die direkte Zuordnung?
... Und warum ist das Präfix-Inkrement-operator anders als die von postfix, wenn Sie beide vor der Zuweisung?
Ich bin mir ziemlich sicher, dass ich nicht verstehen sowas sehr wichtig, wenn es um die Bedienung Assoziativität.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den postfix-operator
a++
erhöhta
und dann wieder den ursprünglichen Wert, D. H. vergleichbar zu diesem:und das Präfix
++a
wird der neue Wert wird zurückgegeben, d.h.Dies ist irrelevant für die Betreiber Vorrang.
(Und Assoziativität regelt, ob
a-b-c
gleich(a-b)-c
odera-(b-c)
.)Operator Rangfolge und Assoziativität von Operatoren nicht sagen, was passiert vor und was passiert nach. Operator-Vorrang/Assoziativität hat das nichts zu tun. In der C-Sprache zeitlichen Beziehungen wie "vor" oder "nach" sind definiert durch so genannte Reihenfolge Punkte und nur durch Sequenz-Punkte (und das ist eine ganz andere Geschichte).
Operator-Vorrang/Assoziativität ist einfach sagt Ihnen, welche Operanden gehören die Operatoren. Zum Beispiel, der Ausdruck
a = b++
formal interpretiert als(a = b)++
und alsa = (b++)
. Operator-Vorrang/Assoziativität ist in diesem Fall einfach sagt Ihnen, dass die letztere interpretation richtig ist, und das erstere ist falsch (d.h.++
gilt fürb
und nicht das Ergebnis vona = b
).Dass, noch einmal, bedeutet nicht, dass
b
sollte zuerst inkrementiert. Operator-Vorrang/Assoziativität, wieder einmal, hat der Feststellung zu tun, was geschieht "ersten" und was geschieht mit "weiter". Es ist einfach sagt Ihnen, dass das Ergebnisb++
Ausdruck zugeordnet ista
. Per definition, das Ergebnisb++
(postfix-Inkrement) ist die original Wert vonb
. Dies ist der Grund, waruma
erhalten die original Wert vonb
1. Wenn die variableb
bekommen erhöht, ist völlig irrelevant, solangea
zugewiesen bekommtb
's original Wert. Der compiler erlaubt die Beurteilung dieser Ausdruck in beliebiger Reihenfolge und das Inkrementb
zu jeder Zeit: alles geht, solangea
irgendwie bekommt die original Wert vonb
(und niemand kümmert sich wirklich, wie das "irgendwie" funktioniert intern).Beispielsweise der compiler auswerten kann
a = b++
als die folgende Sequenz von elementaren Operationenoder es bewerten kann wie folgt
Beachten Sie, dass im ersten Fall
b
tatsächlich erhöht am Ende, während im zweiten Fallb
wird zuerst inkrementiert. Aber in beiden Fällena
bekommt die gleiche korrekte Wert - der ursprüngliche Wert desb
, was ist, was es bekommen sollte.Aber ich muss betonen, dass die beiden oben genannten Beispiele sind hier nur zur Veranschaulichung. In der Realität, Ausdrücke wie
a = ++b
unda = b++
haben keine Reihenfolge inneren Punkte, was bedeutet, dass aus Ihrer Sicht alles in diesen Ausdrücken passiert gleichzeitig. Es gibt kein "bevor", "nachdem", "first", "next" oder "last". Solche Ausdrücke sind "Atomare" in dem Sinne, dass Sie können nicht sinnvoll zerlegt in eine Folge von kleineren Schritten.Operator associativity simply tells you which operands belong to which operators
...... Rangfolge erzählt, dass ..not-operator-Assoziativität. Operator-Assoziativität ins Spiel kommt, wenn wir Operatoren mit gleichem Vorrang. In diesem Fall++
hat eine höhere Priorität als=
dahera=b++
wird interpretiert alsa=(b++)
For example, the expression a = b++ can be formally interpreted as (a = b)++ and as a = (b++)
und das ist, weil für die Operatorrangfolge nicht, weil der operator-Assoziativität.Als AndreyT bereits darauf hingewiesen, Rangfolge und Assoziativität von Operatoren nicht sagen, Sie über die Reihenfolge der Auswertung. Sie nur sagen, Sie über die Gruppierung. Zum Beispiel, Rangfolge, was sagt verwenden, die
a*b+c
gruppiert als(a*b)+c
statta*(b+c)
. Der compiler ist frei, um zu bewertena
,b
undc
in beliebiger Reihenfolge, es sieht halt mit diesen Ausdrücken. Die Assoziativität gibt Auskunft über die Gruppierung, wenn Sie haben Operatoren den gleichen Vorrang, die meisten oft, der gleiche Betreiber. Zum Beispiel, es ist, was Ihnen sagt, dassa-b-c
entspricht(a-b)-c
, nichta-(b-c)
(anders angegeben, Subtraktion ist Links-assoziativ).Reihenfolge der Auswertung definiert ist durch Sequenz-Punkte. Es gibt eine Reihenfolge Punkt am Ende eines vollständigen Ausdrucks (unter anderem). In der Reihenfolge Punkt, alle bisherigen Auswertungen haben stattgefunden, und keiner der nachfolgenden Auswertungen stattgefunden haben, noch.
Blick auf Ihre konkrete Beispiele, in
a=b++;
, das Ergebnis ist zumeist von der definition der post-Inkrement selbst. Post-Inkrement liefert den vorherigen Wert der Variablen, und irgendwann vor dem nächsten sequence-point, der Wert dieser variable wird inkrementiert. Prä-Inkrement ergibt den Wert der Variablen mit der Schrittweite aufgetragen. In keinem Fall aber bedeutet das, dass die variable inkrementiert werden in einer bestimmten Reihenfolge relativ zu der Abtretung. Zum Beispiel, in Ihre pre-increment Beispiel, der compiler ist völlig frei zu tun, etwas vergleichbares:Ebenso in der post-Inkrement-version, die variable kann erhöht werden, vor oder nach der Zuweisung:
oder:
Entweder Weg, allerdings wird der Wert zugewiesen
a
muss der Wert vonb
bevor er inkrementiert.