variable significado pointer c++ c pointers post-increment compound-assignment

c++ - variable - pointers significado



¿Está*p+++= 2 bien definido? (2)

No estoy seguro de si la declaración a continuación está bien definida por el estándar C o no

*p1++ += 2;

u otra declaración similar:

*E1++ <operator>= E2

Del estándar C sobre post-incremento:

El resultado del operador postfix ++ es el valor del operando. Una vez que se obtiene el resultado, el valor del operando se incrementa. (Es decir, se le agrega el valor 1 del tipo apropiado). Consulte las discusiones de los operadores aditivos y la asignación compuesta para obtener información sobre restricciones, tipos y conversiones y los efectos de las operaciones en los punteros. El efecto secundario de actualizar el valor almacenado del operando se producirá entre el punto de secuencia anterior y el siguiente.

Y sobre la asignación de coumpundos:

Una asignación compuesta de la forma E1 op = E2 difiere de la expresión de asignación simple E1 = E1 op (E2) solo en que el valor l E1 se evalúa solo una vez.


El operador de incremento de Postfix ( ++ ) da el valor del operando, es decir, da un valor r . El valor r implica que se usará a la izquierda del operador de asignación ( = ) como un operando.

int i = 0; i++ = 0 // [Error] lvalue required as left operand of assignment

En caso de

*p1++ += 2;

postfix ++ no se aplica en *p1 , pero se aplica al puntero p1++ . Esto se debe a que postfix ++ tiene mayor prioridad que la del operador de derereferencia * . Entonces, el compilador analizará la declaración anterior como

*(p1++) += 2;

y esto dice que:

  • *p1 debe ser evaluado (para producir una variable) antes de agregar 2 y asignarle el resultado.
  • El resultado que se debe almacenar en *p1 debe evaluarse antes del incremento a p1 .
  • Una vez que se evalúa *p1 , p1 puede incrementarse en cualquier momento.

Vamos a reescribir un poco para que quede más claro:

(*p1++) += 2

Por lo tanto, el valor antiguo de p1 se anulará y 2 se agregará a su referente. Y p1 se incrementará después de que haya sido desclasificada (o al menos, después de que se haya cargado su valor anterior y esté esperando ser desclasificada). No hay problema aquí: ninguna de las piezas se usa más de una vez.

Dicho esto, debe considerar volver a escribir el código para mayor claridad:

*p1 += 2; ++p1;