2012-02-13 18 views

Respuesta

26

No hay pedidos entre el incremento y la desreferencia.Sin embargo, el operador * se aplica al resultado de p++, que es el valor original de p antes del incremento.

+0

"los operadores de post-incremento y post-decremento aumentan (o disminuyen) el valor de su operando en 1, pero el valor de la expresión es el valor original del operando antes de la operación de incremento (o decremento) "https://en.wikipedia.org/wiki/Increment_and_decrement_operators – Blas

3

Dada q = *p++;, q obtiene el valor que p señaló que antes del incremento. Otra forma de decirlo es que el valor de la expresión *p++ es el valor que p señaló antes de incrementarse.

+0

Puede encontrar '* p', incrementar' p' y asignar el valor de '* p' (que se calculó primero) a' q' – asaelr

+0

@asaelr Es un punto justo que la asignación puede suceder después del incremento, pero el efecto es el mismo: q obtiene el valor de * p antes de que se incremente p. – Caleb

+0

El efecto es el mismo, pero la pregunta era qué pasa primero. – asaelr

2

Los operadores postfix ++ y - tienen esencialmente mayor precedencia que los operadores unarios de prefijo. Por lo tanto, * p ++ es equivalente a * (p ++); incrementa p, y devuelve el valor que apuntó antes de que p se incrementara.

Para incrementar el valor apuntado por p, use (* p) ++ (o tal vez ++ * p, si el orden de evaluación del efecto secundario no importa).

3

Pruébalo. El programa

#include <stdio.h> 

int main(void) { 
    int p[2]; 
    int *q = p; 
    p[0] = 10; 
    p[1] = 100; 

    printf("%d\n", *q++); 
    printf("%d\n", *q); 

    return 0; 
} 

impresiones

10 
100 

que muestran que el ++ se aplica a p, no *p, y que el incremento ocurre después de que el eliminar la referencia.

EDITAR: (Gracias a @EricLippert por convencerme de sacar K & R)

No sólo podrá haber un sucede después relación, pero de acuerdo a la página K & R 203, hay debe ser:

Una expresión de postfix seguida de un operador ++ o - es una expresión de postfijo. El valor de la expresión de la expresión es el valor del operando. Después de que se tomó nota del valor, el operando se incrementa (++) o decrementa (-) por 1.

(énfasis mío)

Por supuesto, no creo que K & R dice algo acerca de la semántica de C en presencia de multihilo (según Wikipedia la especificación pthreads fue lanzada en 1995), pero para un programa de un solo hilo K & R es bastante claro.

+4

Espera un momento aquí. En ** C ** ciertamente puede haber una relación de "sucede después"; si hay o no hay un detalle de implementación del compilador. Un compilador de C tiene amplia discreción al elegir cómo ordenar los efectos secundarios dentro de un punto de secuencia, y puede elegir hacer el efecto secundario de un ++ después de todo lo demás si así lo desea. Un compilador de C# no tiene la misma latitud; la especificación de C# es muy clara acerca de cuándo se debe observar exactamente ese efecto secundario. (Observado dentro de un subproceso de ejecución, el orden en que otro subproceso observa el efecto secundario no está especificado). –

11

En el operators table, puede ver que el operador de sufijo ++ tiene un lugar más alto que el operador unitario *.

Por lo tanto, *p++ aumento p (y no *p), y regresar el valor si la dirección que contenían p antes del incremento (ya que es la suffix ++).

Pero el orden depende de la implementación. Puede comenzar desreferenciando p, y luego aumentarlo, y puede almacenar el valor anterior de p, aumentarlo y luego desreferenciar el valor anterior.

Cuestiones relacionadas