Diferença entre C++ 14 e C++ 17 usando: `* p++=* p`



c++14 c++17 (1)

Enquanto escrevia algum código, me deparei com um problema em que os valores que defini estavam sendo configurados incorretamente. Eu finalmente encontrei a linha culpada e, enquanto os testes em torno descobriram que ela se comportou de maneira diferente em C ++ 14 e C ++ 17. O código é o seguinte:

#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;
}

Em C ++ 14, imprime:

Position 0 has value 240
Position 1 has value 15
Position 2 has value 255

E no C ++ 17 imprime:

Position 0 has value 0
Position 1 has value 15
Position 2 has value 255

Estou curioso porque age de forma diferente em diferentes versões do C ++. Parece que em C ++ 14 o *p lado direito da atribuição é avaliado após o ++ . Isso mudou? E se o ++ tiver precedência, por que isso não acontece antes da desreferência no lado esquerdo do operador de atribuição?


Ler e gravar na variável (via pós-incremento) costumava ter um comportamento indefinido, porque o = não introduzia um ponto de seqüência. Você poderia ter recebido qualquer comportamento (ou nenhum, ou explosões) em C ++ 14.

Agora, há uma ordem de sequenciamento definida para este caso e seus resultados do C ++ 17 são confiáveis.

Embora ainda seja ruim, o código não está claro que não deve ser escrito!





c++17