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 agregar2
y asignarle el resultado. - El resultado que se debe almacenar en
*p1
debe evaluarse antes del incremento ap1
. - 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;