2010-03-04 9 views

Antwort

34

Ja, es ist äquivalent zu:

int bar() 
{ 
    int temp = x; 
    ++x; 
    return temp; 
} 
+0

Gute Erklärung, danke. – patros

+0

Wenn 'int' kein' int' ist, sondern ein 'MyClassWithOverloadedOperators', dann liegen Sie einfach falsch. –

+4

@Pavel: Ich stimme nicht zu. Eine Klasse mit einem überladenen Post-Inkrement-Operator, der die richtige Post-Inkrement-Semantik nicht implementiert, ist falsch. – Void

7

Ja ist es ... es wird den x-Wert zurückgeben, bevor es inkrementiert wird und danach wird der Wert von x + 1 sein ... wenn es darauf ankommt.

4

Es ist definiert.

Es gibt den Wert x vor der Inkrementierung zurück. Wenn x eine lokale (nicht statische) Variable ist, hat diese Post-Inkrementierung keine Auswirkungen, da lokale Variablen einer Funktion nicht mehr existieren, sobald die Funktion zurückkehrt. Wenn x eine lokale statische Variable, eine globale Variable oder eine Instanzvariable ist (wie in Ihrem Fall), wird der Wert nach der Rückkehr inkrementiert.

+0

Aber was passiert im Falle eines überladenen '++' -Operators in einer benutzerdefinierten Klasse? Wird der Effekt ausgeführt? – Dario

+2

@Dario Ja, wird es sein. Der Ausdruck nach "return" wird vollständig ausgewertet, bevor die Rückgabe ausgeführt wird. –

+1

@Dario. Ja, genau aus dem gleichen Grund, dass, wenn Sie x.domething(); zurückgeben, der Effekt von 'dosomething' vor der Rückkehr ausgeführt wird. Überladenes Post-Inkrement ist keine Magie, es ist nur eine Funktion, die einen Wert zurückgibt, der zufällig der alte Wert ist. –

4

Ja.

In postincrement (x ++) der Wert von x ausgewertet wird (in Ihrem Fall zurückgegeben) vor 1 hinzugefügt wird.

In preincrement (++ x) wird der Wert von x ausgewertet, nachdem 1 hinzugefügt wurde.

bearbeiten: Sie können die Definition von pre und post Zuwachs in den Links vergleichen.

1

Die meisten Programmiersprachen, wie C++, sind rekursiv in der Reihenfolge, in der Operationen ausgeführt werden (ich mache keine Implikation darüber, wie der Code tatsächlich vom Compiler hier implementiert wird). Zusammengesetzte Operationen, die sich aus beliebigen gut definierten Operationen zusammensetzen, sind selbst wohldefiniert, da jede Operation auf einer Last-in-first-out-Basis ausgeführt wird.

Post-Zuwachs gibt der Wert der Variablen vor es Inkrementieren erhöht wird, so dass der return Operation diesen Wert recieves. Es muss keine spezielle Definition dieses Verhaltens gemacht werden.

+1

Ich glaube nicht, dass die Frage war, welcher Wert zurückgegeben würde, sondern vielmehr, ob das Inkrement auftreten würde. Es ist ein verständliches Problem, wenn Ihr mentales Modell es so aussehen lässt, dass "Rückkehr" ein sofortiges Ende der Funktion verursacht - gibt es wirklich Zeit, dass das Inkrement angewendet wird, wenn die Funktion bereits vorbei ist? Natürlich wissen wir, dass die Antwort * ja * ist, aber nur, weil der Compiler eine Transformation wie in Poitas Antwort ausführt, um sicherzustellen, dass die Funktion erst dann wiederkehrt, wenn alle Nebenwirkungen angewendet wurden. –

+0

Das ist was ich meine. Die 'return'-Anweisung wird nach' x ++ '" returns "gefunden. Da 'x ++' eine Operation ist, sollte sie so aussehen, als würde sie in dem von Poita_ bereitgestellten Demo-Code zurückgegeben. Auf diese Weise ist es leicht zu erkennen, dass 'x ++' ausgeführt wird und sein Rückgabewert an die Anweisung 'return' übergeben wird. Es macht keinen Sinn, dass 'x ++' zurückkehren und * dann * erhöhen würde. –