在编写一些代码时,我遇到了一个问题,即我设置的值设置错误。我最终找到了罪魁祸首,并在测试时发现它在C ++ 14和C ++ 17上的表现有所不同。代码如下:
vkQueueSubmit
在C ++ 14上它打印:
#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 ++ 17上它会打印:
Position 0 has value 240
Position 1 has value 15
Position 2 has value 255
我很好奇为什么它在不同的C ++版本上表现不同。好像在C ++ 14上,赋值的Position 0 has value 0
Position 1 has value 15
Position 2 has value 255
在*p
之后求值。这个改变了吗?如果++
具有优先权,为什么在赋值运算符左侧取消引用之前就不会发生这种情况?
答案 0 :(得分:41)
由于变量=
没有引入序列点,因此(通过后递增)对变量进行读取和写入(通过后递增)。您可能已经在C ++ 14中收到任何行为(或没有任何行为或爆炸)。
Now, there is a sequencing order defined for this case和您的C ++ 17结果可靠。
尽管它仍然很糟糕,但不应该编写不清楚的代码!