Vro*_*del 8 c c++ undefined-behavior unions language-lawyer
以下是未定义的行为吗?
union {
int foo;
float bar;
} baz;
baz.foo = 3.14 * baz.bar;
Run Code Online (Sandbox Code Playgroud)
我记得在两个序列点之间从同一底层内存进行写入和读取是UB,但我不确定。
我记得在两个序列点之间从同一底层内存进行写入和读取是UB,但我不确定。
读取和写入同一表达式中的同一内存位置不会调用未定义的行为,除非该位置在两个序列点之间修改多次,或者副作用相对于使用同一位置处的值的值计算而言是无序的。
如果标量对象上的副作用相对于同一标量对象上的不同副作用或使用同一标量对象的值的值计算是无序的,则行为是未定义的。[...]
表达方式
baz.foo = 3.14 * baz.bar;
Run Code Online (Sandbox Code Playgroud)
如果bar在之前初始化,则具有明确定义的行为。原因是 的副作用baz.foo是相对于对象baz.foo和的值计算来排序的baz.bar。
[...]更新左操作数的存储值的副作用是在左操作数和右操作数的值计算之后排序的。操作数的计算是无序的。