2011-12-05 7 views
5

tengo esta declaración:Precedencia de operadores en C - Devolver un valor

return *local_stack_var2++ + 42;

¿Estos son los pasos adecuados cuando lo descomponen:
1. local_stack_var2 Desreferencia
2. Añadir 42 a la referencia local_stack_var2 (la función devolverá realmente este valor)
3. Antes de que la función termine, se activará el incremento posterior, incrementando el valor del objeto apuntado por local_stack_var2

¿Entonces en formato de código, se vería algo como esto?

int temp = *local_stack_var2 //step 1; 
int returnValue = temp + 42; //step 2, compiler will return THIS value  
*local_stack_var2 = *local_stack_var2 + 1; //step 3 
return returnValue; 

¡Gracias!

+0

prioridad de precedencia y la precedencia ... –

Respuesta

8

Cerrar, pero ++ (postincrement) tiene una precedencia mayor que unary *, por lo que sucede primero. El orden de las operaciones sería:

  1. Mensaje incrementar local_stack_var2 de modo que se incrementa en uno, pero la expresión se evalúa al valor original, no el valor incrementado
  2. Desreferencia que valor original
  3. añadir 42 a lo fue obtenido por eliminación de referencias al valor original antes mencionado
  4. devolverá ese valor

Así en el código, que sería como (no exactamente, pero cerca)

int* temp = local_stack_var2; 
local_stack_var2 = local_stack_var2 + 1; 
int retval = *temp; 
reval = retval + 42; 
return retval; 
+0

El postincremento no ocurre necesariamente * primero *. '++' tiene una precedencia mayor que '*' significa solo que es 'local_stack_var2' que se incrementa, no' * local_stack_var2' - los controles de precedencia * qué * se incrementa, no * cuando * se incrementa. El incremento real puede ocurrir en cualquier momento hasta que la función regrese. – caf

+0

@caf sí, eso es lo que estaba pensando cuando puse "me gusta" en cursiva y agregué "(no precisamente, pero cerca)". Técnicamente, de ninguna manera lo escribirías sería correcto por eso, pero no pensé que fuera lo suficientemente importante como para preocupar al OP con eso. –