Operatorassoziativität in C speziell Präfix und Postfix Erhöhungs- und Verringerungs

StackOverflow https://stackoverflow.com/questions/2395423

  •  25-09-2019
  •  | 
  •  

Frage

C In Betrieb Assoziativität ist als solche für inkrementieren, dekrementieren und Zuordnung.

  2. postfix ++ and -- 
  3. prefix ++ and -- 
  16. Direct assignment = 

Die vollständige Liste zu finden ist hier 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 eine gleich 1 mit b ++, wenn die postfix Inkrementoperator sollte vor der direkten Zuweisung geschehen?

Und warum ist das Präfix Inkrementoperator anders als die Postfix, wenn sie beide vor der Aufgabe?

Ich bin mir ziemlich sicher, dass ich etwas nicht verstehe sehr wichtig, wenn es um den Betrieb Assoziativität kommt.

War es hilfreich?

Lösung

Der Postfix-Operator a++ wird a erhöhen und dann wieder den ursprünglichen Wert d ähnlich wie folgt aus:

{ temp=a; a=a+1; return temp; }

und das Präfix ++a den neuen Wert d.h zurück.

{ a=a+1; return a; }

Das ist irrelevant für den Operator Vorrang .

(Und Assoziativität regiert, ob a-b-c zu (a-b)-c oder a-(b-c) entspricht.)

Andere Tipps

Operator Vorrang und Assoziativität sagen Ihnen nicht, was passiert, vor und was passiert, nach . Operator Vorrang / Assoziativität hat nichts damit zu tun. In der Sprache C zeitlichen Beziehungen wie „vor“ oder „nach“ durch sogenannte Sequenzpunkte und nur durch Sequenzpunkte (und das ist eine völlig separate Geschichte) definiert.

Operator Vorrang / Assoziativität einfach sagen Sie, welche Operanden zu gehören, die Betreiber. Zum Beispiel kann der Ausdruck a = b++ formal als (a = b)++ und als a = (b++) interpretiert werden. Operator Vorrang / Assoziativität ist dieser Fall sagt man einfach, dass diese Interpretation korrekt ist und die erste ist falsch (das heißt ++ gilt für b und nicht auf das Ergebnis der a = b).

Das wiederum bedeutet nicht, dass b sollte zuerst erhöht werden. Operator Vorrang / Assoziativität wiederum hat mit der Feststellung zu tun, was geschieht „ersten“ und was passiert, „weiter“. Es sagt Ihnen einfach, dass das Ergebnis der b++ Ausdruck zu a zugeordnet. Per Definition ist das Ergebnis b++ (postfix Zuwachs) der Original Wert von b. Aus diesem Grund a die Original Wert von b erhalten, die 1 ist, wenn die Variable b erhöht wird erhalten, ist völlig irrelevant, solange a erhält zugewiesenen b Original Wert . Der Compiler ist erlaubt, diesen Ausdruck in beliebiger Reihenfolge und Schritt b jederzeit zu bewerten: alles geht, solange a bekommt irgendwie die Original Wert von b (und niemandem wirklich Sorgen, wie die „irgendwie“ Werke intern).

Zum Beispiel kann der Compiler a = b++ wie die folgende Sequenz von elementaren Operationen auswerten

(1) a := b
(2) b := b + 1

oder es kann bewerten es folgt als

(1) b := b + 1
(2) a = b - 1

Beachten Sie, dass im ersten Fall b tatsächlich am Ende erhöht, während im zweiten Fall b zuerst erhöht wird. Aber in beiden Fällen bekommt a den gleichen korrekten Wert - den ursprünglichen Wert von b, das, was es ist, sollte zu erhalten.

Aber ich muss betonen, dass die beiden oben genannten Beispiele sind hier nur zu Veranschaulichungszwecken. In Wirklichkeit Ausdrücke wie a = ++b und a = b++ haben keine Sequenzpunkte nach innen, das heißt, aus Ihrer Sicht alles in diesen Ausdrücken geschieht gleichzeitig . Es gibt kein „vor“, „nach“, „erste“, „nächste“ oder „letzte“. Solche Ausdrücke sind „atomic“ in dem Sinne, dass sie nicht sinnvoll in eine Folge von kleineren Schritten zerlegt werden können.

Wie AndreyT bereits erwähnt, Vorrang und Assoziativität Ihnen nicht sagen, über Reihenfolge der Auswertung. Sie sagen Ihnen, nur über die Gruppierung. Zum Beispiel ist Vorrang, was die Verwendung erzählt, dass a*b+c als (a*b)+c gruppiert statt a*(b+c). Der Compiler ist frei a, b und c in beliebiger Reihenfolge sie sieht fit mit einem dieser Ausdrücke zu bewerten. Assoziativität informiert Sie über die Gruppierung, wenn Sie Operatoren gleicher Priorität haben, am häufigsten, die gleichen Operatoren. Zum Beispiel ist es, was man sagt, dass a-b-c zu (a-b)-c äquivalent ist, nicht a-(b-c) (anders angegeben, Subtraktion links assoziativ ist).

Auftrag der Auswertung wird durch Sequenzpunkte definiert. Es gibt einen Sequenzpunkt am Ende eines vollständigen Ausdrucks (unter anderem). An der Sequenzpunkt, werden alle bisherigen Bewertungen haben stattgefunden haben, und keiner der anschließenden Auswertungen haben kann noch gemacht.

Ein Blick auf Ihre speziellen Beispiele, in a=b++;, ist das Ergebnis meist aus der Definition der Post-Inkrement selbst. Post-Inkrement ergibt den früheren Wert der Variable, und irgendwann vor der nächsten Sequenz Punkt wird der Wert dieser Variablen inkrementiert. Ein pre-increment ergibt den Wert der Variablen mit dem Inkrement angewendet. In keinem der beiden Fälle führt jedoch, bedeutet die Variable in einer bestimmten Reihenfolge in Bezug auf die Zuordnung inkrementiert werden muss. Zum Beispiel in der Prä-Inkrement Beispiel ist der Compiler völlig frei etwas Gleichwertiges zu tun:

temp = b+1;
a = temp;
b = b + 1;

Auch in der Post-Inkrement-Version kann die Variable vor oder nach der Zuordnung erhöht werden:

a = b;
b = b + 1;

oder:

temp = b;
b = b + 1;
a = temp;

So oder so, aber zugewiesen der Wert auf a den Wert von b sein muss, bevor er erhöht wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top