在编写一些代码时,我遇到了我设置的值设置错误的问题。我最终找到了罪魁祸首,在进行测试时发现它在 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/