Frage

bin ich sehr überzeugt, mit der Erklärung, die ich gefunden habe, die sagten, dass i = ++i nicht undefiniert so weit wie C ++ 0x betrifft, aber ich bin nicht in der Lage, ob das Verhalten von i += ++i zu beurteilen, gut definierte oder nicht. Jeder Abnehmer?

War es hilfreich?

Lösung

Die Argumentation, dass Marken i = ++i gut definiert ist, kann ebenso verwendet werden, dass i += ++i beweisen muss auch sein gut definiert.

i += ++i entspricht i += (i += 1) und die neuen Sequenzierungsregeln verlangen, dass die Vergabestelle, bevor der Wert-Berechnung des i += 1 Unterausdruck nimmt.
Dies bedeutet, dass das Ergebnis des Ausdrucks i += ++i das gleiche wie für i = 2 * i + 1 sein muss.

Edit:. Ich habe meine Antwort zu revidieren, weil das Verhalten schließlich nicht definiert ist
Das Verhalten von i += ++i ist nicht definiert, da die Wert-Berechnungen des Unterausdrücke i (linke Seite Argument) und ++i sind in Bezug zueinander nicht sequenzierte und ein von ihnen enthält ein Update des Objekt i.

Das ist kein Problem für den Ausdruck i = ++i, weil es die i auf der linke Seite keine L-Wert-to-rvalue Umwandlung unterzogen werden, die im i += ++i Fall geschehen.


Auf einer Seite-Hinweis: Verwenden Sie nicht einen solchen Code in jedem ernsthaften Projekt schreiben. Es verlässt sich zu sehr auf genau die Sequenzierungsregeln zu kennen und es wird viele Menschen geben, die entweder nicht richtig die Sequenzierungsregeln verstehen, sind keine Kenntnis von der Änderung der Regeln, die das Ergebnis von DR 637 ist oder gestolpert erhalten durch einige wichtige fehlt Aspekte des Ausdrucks in Frage (wie mir geschah, als die erste Revision dieser Antwort Komponieren).

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