C语言联合体赋值后活跃成员及行为合规性问题咨询
联合赋值相关问题解答
假设sizeof(int) == sizeof(float),针对给出的代码片段,解答如下:
1. 该代码是否具有定义行为?
有定义行为。C++标准允许直接对同类型的联合对象执行赋值操作,不管两个联合当前的活跃成员是什么,赋值操作会完整复制源对象的所有内存字节到目标对象,这一操作完全合法。
2. 执行赋值操作后,u1的活跃成员是什么?
u1的活跃成员是f。当对联合对象执行赋值操作时,目标联合(u1)的活跃成员会与源联合(u2)的活跃成员保持一致——u2的活跃成员是f,因此赋值完成后u1的活跃成员变为f。
3. 执行赋值操作后,读取u1的哪个成员不会引发未定义行为?
读取u1.f不会引发未定义行为。因为f是u1当前的活跃成员,C++标准明确规定读取联合的活跃成员是定义良好的操作;而读取非活跃成员u1.i属于未定义行为,除非通过unsigned char类型的指针访问其内存字节(这种字节级访问不受活跃成员限制)。
内容的提问来源于stack exchange,提问作者cerveka2
相关产品推荐
相关产品推荐

