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.