在编写代码时,我遇到了一个问题,我设置的值被错误地设置了。最终我找到了罪魁祸首,并在测试中发现它在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
会在++
之后被计算。这是为什么呢?如果++
具有优先级,为什么它不会在赋值运算符左侧的解引用之前发生呢?
#include <stdio.h>
后跟着#include <cstring>
是否将函数名称memset
放在全局作用域中。 - L. F.<cstring>
,但写了C的memset
,这可能会在某些工具链上编译失败。OP想要的是<string.h>
或std::memset
。(更糟糕的是,<stdio.h>
也可能会传递地引入memset
!) - Lightness Races in Orbitstd::memset
的。 - ApplePearPersonuint8_t
方面遇到了同样的问题。 - Lightness Races in Orbit