Diferencia entre C++ 14 y C++ 17 usando: `* p++=* p`
c++14 c++17 (1)
Leer y escribir en la variable (a través del incremento posterior) solía tener un comportamiento indefinido, porque
=
no introdujo un punto de secuencia.
Podría haber recibido cualquiera de los comportamientos (o ninguno, o explosiones) en C ++ 14.
Ahora, hay un orden de secuencia definido para este caso y los resultados de C ++ 17 son confiables.
Aunque sigue siendo malo, ¡código poco claro que no debe escribirse!
Mientras escribía un código, encontré un problema en el que los valores que configuré se estaban configurando incorrectamente. Finalmente, encontré la línea culpable y, al realizar pruebas alrededor, descubrí que se comportaba de manera diferente en C ++ 14 y C ++ 17. El código es el siguiente:
#include <stdio.h>
#include <cstdint>
#include <cstring>
int main()
{
uint8_t *p = new uint8_t[3];
memset(p, 0x00, 1);
p++;
memset(p, 0xF0, 1);
p++;
memset(p, 0xFF, 1);
p--;
p--;
// This line in particular
*p++ = *p;
*p++ = 0x0F;
p--;
p--;
printf("Position 0 has value %u/n", *p);
p++;
printf("Position 1 has value %u/n", *p);
p++;
printf("Position 2 has value %u/n", *p);
return 0;
}
En C ++ 14 se imprime:
Position 0 has value 240
Position 1 has value 15
Position 2 has value 255
Y en C ++ 17 se imprime:
Position 0 has value 0
Position 1 has value 15
Position 2 has value 255
Tengo curiosidad por qué actúa de manera diferente en diferentes versiones de C ++.
Parece que en C ++ 14 el lado derecho
*p
de la tarea se evalúa después de la
++
.
¿Esto cambió?
Y si el
++
tiene prioridad, ¿por qué no sucede antes de la desreferencia en el lado izquierdo del operador de asignación?