C++14 和 C++17 之间的区别使用:“*p++ = *p”
Difference between C++14 and C++17 using: `*p++ = *p`
在编写一些代码时,我遇到了一个问题,即我设置的值设置错误。我最终找到了罪魁祸首,在测试时发现它在 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 %un", *p);
p++;
printf("Position 1 has value %un", *p);
p++;
printf("Position 2 has value %un", *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 中收到行为(或没有,或爆炸(。
现在,为这种情况定义了排序顺序,并且您的 C++17 结果是可靠的。
虽然它仍然很糟糕,但不应该编写的不清楚的代码!
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何在c++17中制作一个模板包装器/装饰器
- 枚举环境变量的惯用C++14/C++17方法
- gcc和c++17的过载解析失败
- 数据成员SFINAE的C++17测试:gcc vs clang
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- C++17中的并行执行策略
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- 并行用于C++17中数组索引范围内的循环
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 在C++17中,引用const字符串的语义应该是什么
- 为什么这种直接初始化有效?(C++17)
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- 为什么 C++17 中没有 std::construct_at?
- 如何在 Mac 上使用 c++17 并行标准库算法?
- G++ C++17 类模板参数推导在非常特殊的情况下不起作用
- 字符转换功能 std::isupper() & std::islower() C++17
- C++17 文件系统::remove_all 带有通配符路径
- 如何在 C++17 STL 并行算法中处理调度?
- 容器,其中每个项可以有多个非唯一键 (c++17)