c++ - C++14 和 C++17 使用 : `*p++ = *p` 的区别

标签 c++ c++14 c++17

在编写一些代码时,我遇到了我设置的值设置错误的问题。我最终找到了罪魁祸首,在进行测试时发现它在 C++14 和 C++17 上的表现不同。代码如下:

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

在 C++14 上打印:

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

在 C++17 上它会打印:

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

我很好奇为什么它在不同的 C++ 版本上表现不同。看起来好像在 C++14 上,赋值的 *p 右侧是在 ++ 之后评估的。这改变了吗?而如果++有优先权,为什么不在赋值运算符左侧的解引用之前发生呢?

最佳答案

读取和写入变量(通过后增量)曾经有未定义的行为,因为 = 没有引入序列点。在 C++14 中,您可能会收到任何一种行为(或没有,或爆炸)。

Now, there is a sequencing order defined for this case并且您的 C++17 结果是可靠的。

虽然还是很烂,不清楚不应该写的代码!

关于c++ - C++14 和 C++17 使用 : `*p++ = *p` 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57091841/

相关文章:

c++ - 为什么 I/O 相关设置会导致段错误?

c++ - 具有 lambda 的多态访问者

c++ - 使用 glVertexAttribPointer 时,我应该为 gl_Normal 属性使用什么索引?

c++ - 强制 Visual C++ 仅为我的文件生成 XML 注释?

c++ - 依赖于模板的基本成员未正确解析

c++ - 当指针对象有可选参数时如何传递函数指针?

c++ - OS X 从 Carbon 到 Cocoa 窗口创建?

c++ - 在嵌套 Lambda 中捕获 Lambda 的静态

c++ - 我应该使用 QScopedPointer 还是 std::unique_ptr?

c++ - c++17 中的动态异常规范是否无效?