2010-03-04 22 views

Respuesta

34

sí, es equivalente a:

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

Buena explicación, gracias. – patros

+0

Si 'int' no es un' int', sino un 'MyClassWithOverloadedOperators', entonces estás equivocado. –

+4

@Pavel: No estoy de acuerdo. Una clase con un operador de incremento por incremento sobrecargado que no implementa la semántica de incremento posterior correcta es incorrecta. – Void

7

Sí, es ... devolverá el valor de x antes de incrementarlo y luego el valor de x será + 1 ... si es importante.

4

Está definido.

Devuelve el valor de x antes del incremento. Si x es una variable local (no estática), este incremento de publicación no tiene ningún efecto ya que las variables locales de una función dejan de existir una vez que la función retorna. Pero si x es una variable estática local, una variable global o una variable de instancia (como en su caso), su valor se incrementará después del retorno.

+0

Pero, ¿qué sucede en el caso de un operador '++' sobrecargado en una clase personalizada? ¿Se realizará su efecto? – Dario

+2

@Dario Sí, lo será. La expresión que sigue a "devolver" se evaluará por completo antes de que se ejecute la devolución. –

+1

@Dario. Sí, por exactamente la misma razón que si 'devuelve x.dosomething();', el efecto de 'dosomething' se realizará antes de la devolución. El post-incremento sobrecargado no es mágico, es solo una función que devuelve un valor, que pasa a ser el valor anterior. –

4

Sí.

En postincrement (x ++) se evalúa el valor de x (devuelto en su caso) antes de 1, se añade.

En preincrement (++ x) se evalúa el valor de x después de 1.

Editar: Se puede comparar la definición de pre y post incremento en los enlaces.

1

La mayoría de los lenguajes de programación, como C++, son recursivos en el orden en que se llevan a cabo las operaciones (no estoy implicando cómo el compilador realmente implementa el código aquí). Las operaciones compuestas que se componen de cualquier operación bien definida están bien definidas, ya que cada operación se lleva a cabo en una base de último en entrar, primero en salir.

postincremento devuelve el valor de la variable que se incrementa antes de incrementándolo, por lo que la operación return recieves ese valor. No se debe hacer una definición especial de este comportamiento.

+1

No creo que la preocupación era sobre qué valor se devolvería, sino más bien sobre si el incremento ocurriría. Es una preocupación comprensible si su modelo mental considera que el "retorno" provoca un final inmediato de la función: ¿hay realmente tiempo para aplicar el incremento si la función ya se ha terminado? Por supuesto, sabemos que la respuesta es * sí *, pero solo porque el compilador realiza una transformación como en la respuesta de Poita para asegurarse de que la función no vuelva hasta que se hayan aplicado todos los efectos secundarios. –

+0

Eso es lo que quiero decir. La declaración 'return' se encuentra después de' x ++ '" returns ". Dado que 'x ++' es una operación, se debe pensar que está retornando como en el código de demostración que proporcionó Poita_. De esta forma, es fácil ver que dado que 'x ++' se ejecuta y su valor de retorno se pasa a la declaración 'return'. No tiene sentido que 'x ++' vuelva y * luego * incremente. –

Cuestiones relacionadas