Vamos a empezar con *p += 1
voy a tratar de responder a esta de un poco de un ángulo diferente ... mirada Paso 1 Vamos a los operadores y los operandos: En este caso, es un operando (el puntero p), y tenemos dos operadores, en este caso * para desreferencia y + = 1 para incremento. Paso 2, que tiene la mayor precedencia * tiene mayor precedencia sobre + =
*P++
Éste es un poco más complicado ... tal vez incluso malvados De nuevo tenemos un operando (p puntero) y dos operadores, solo ahora el * para la desreferencia y el incremento ++ post tienen la misma precedencia. (En algunas tablas el ++ en una publicación es una precedencia más alta.)
Paso 1 Veamos los operadores y los operandos: en este caso es el operando, y usted tiene dos operadores, en este caso * para desreferenciación y ++ para incremento. Paso 2, que tiene la precedencia más alta? ++ tiene una precedencia mayor que * Nota: incluso si tienen la MISMA precedencia que asocian de derecha a izquierda, de nuevo, ++ está antes de * Paso 3 (la parte complicada ...) ¿Dónde está ++? que es el lado derecho del operando, lo que significa Incremento POSTAL En este caso, el compilador toma una 'nota mental' para llevar a cabo el incremento DESPUÉS se hace con todos los demás operadores ... Lo que después de los medios ?Significa que solo aplicará el incremento como el último paso antes del siguiente ';' entonces se hará con todos los demás operadores que están en la misma 'línea' nota: si era * ++ p, entonces lo hará ANTES de que cualquier otro operador en la misma línea, en este caso, es equivalente a tomando dos del registro del procesador, uno mantendrá el valor de la desreferenciada * p y el otro mantendrá el valor del p ++ incrementado, la razón en este caso son dos, es la actividad POST ... Aquí es donde en este caso es complicado, y parece una contradicción. Uno esperaría que el ++ tenga prioridad sobre el *, lo que hace, solo que el POST significa que se aplicará solo después de TODOS los demás operandos, ANTES del siguiente ';' token ...
Como dije, la parte engañosa es que cualquier incremento que esté a la derecha de un operando se apartará, y se aplicará como la ÚLTIMA operación antes de pasar a la siguiente línea. .
porque '* p ++' es el mismo que '* (p ++)' –
[precedencia de los operadores] (http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence) – chris
también intente 'void foo3 (char ** p) {(* p) ++; } ' –