No estoy muy seguro de cuál es el orden aquí. Es: 1) eliminar la referencia al valor del puntero P después de aumentarla 2) eliminar la referencia al valor del puntero P antes de aumentarla¿Aumenta * p ++ después de la desreferenciación?
Respuesta
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.
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.
Puede encontrar '* p', incrementar' p' y asignar el valor de '* p' (que se calculó primero) a' q' – asaelr
@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
El efecto es el mismo, pero la pregunta era qué pasa primero. – asaelr
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).
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.
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). –
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.
- 1. ¿Por qué es la desreferenciación un puntero llamado desreferenciación?
- 2. Velocidad de desreferenciación del puntero de estructura C
- 3. ¿Aumenta la velocidad de PHP?
- 4. ¿Cómo ocurre la desreferenciación de un puntero de función?
- 5. puntero de desreferenciación en la matriz de enteros
- 6. El método recursivo aumenta la complejidad ciclométrica
- 7. ¿Por qué no funciona "set -P" después de una tubería?
- 8. ¿Aumenta max_execution_time en PHP?
- 9. Flechas anuladas de desreferenciación en Perl: ¿omitir o no omitir?
- 10. XslCompiledTransform.Load() aumenta System.IO.FileNotFoundException
- 11. ¿La aplicación/json-p text/json-p ya es implementable?
- 12. ¿Qué aumenta en Python?
- 13. Advertencia: el elenco aumenta la alineación requerida
- 14. ¿Aumenta la memoria del plugin maven tomcat7?
- 15. ¿Agregar dos .NET SqlDecimales aumenta la precisión?
- 16. decimal (s, p) o número (s, p)?
- 17. Aumenta Xms y Xms para la aplicación de ejecución grails
- 18. 1.1 CreateMap de AutoMapper aumenta NullReferenceException después de mucho tiempo de actividad
- 19. ¿Aumenta el tamaño de la pila al compilar con mingw?
- 20. Aumenta var_display_max_depth para xdebug
- 21. El uso de la memoria Django aumenta con cada solicitud
- 22. Manipulación de espacio duro: <p> </p> vs. <p></p>
- 23. ¿Eliminar p, donde p es un puntero a la matriz siempre una pérdida de memoria?
- 24. Por qué/cuándo usar (!! p) en lugar de (p! = NULO)
- 25. ¿Por qué * p ++ es diferente de * p + = 1?
- 26. Cómo borrar p: mensaje de p: diálogo al cerrar?
- 27. Resuelve recurrencia de la forma p [n, m] == p [n, m-2] + p [n-1, m-1] + p [n-2, m]
- 28. ¿Qué aumenta el recuento de retención de un objeto?
- 29. ¿Aumenta la capacidad de memoria del emulador de Android?
- 30. ¿Aumenta (o reduce) la seguridad de los usuarios web?
"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