operator bitwise and c operators

bitwise - ¿Se incrementa*p++ después de la desreferenciación?



operator c# (5)

Dado q = *p++; , q obtiene el valor que p apunta antes del incremento. Otra forma de decirlo es que el valor de la expresión *p++ es el valor que p apunta antes de ser incrementado.

Esta pregunta ya tiene una respuesta aquí:

No estoy realmente seguro de cuál es el orden aquí. Es: 1) Eliminar el valor del puntero p después de aumentarlo 2) Eliminar el valor del puntero p antes de aumentarlo


En la tabla de operadores , puede ver que el operador de sufijo ++ tiene un lugar más alto que el * operador único.

Por lo tanto, *p++ aumenta p (y no *p ), y devuelve el valor de la dirección que p contenía antes del incremento (ya que es el suffix ++ ).

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


Intentalo. 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; }

huellas dactilares

10 100

mostrando que ++ aplica a p , no a *p , y que el incremento ocurre después de la desreferencia.

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

No solo puede haber una relación de suceso después, sino que de acuerdo con K & R página 203, debe haber:

Una expresión postfix seguida de un operador ++ o - es una expresión postfix. El valor de la expresión de la expresión es el valor del operando. Una vez que se anota el valor, el operando se incrementa (++) o disminuye (-) en 1.

(énfasis mío)

Por supuesto, no creo que K & R diga nada sobre la semántica de C en presencia de multihilo (según Wikipedia la especificación pthreads se lanzó en 1995), pero para un programa de un solo hilo K & R es bastante claro.


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

Para incrementar el valor al que apunta p , use (*p)++ (o quizás ++*p , si el orden de evaluación del efecto secundario no importa).


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