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í:
- ¿Post-incremento en un puntero desreferenciado? 12 respuestas
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.