C++ 值是什么;这段代码中的变量a和b是什么? #包括 结构向量2 { int x,y; }; 结构向量4 { 公众: 联盟 { 结构 { 整数x,y,z,w; }; 结构 { 向量2a,b; }; }; }; 无效打印向量(常量向量2和向量) { std::cout
初始化C++ 值是什么;这段代码中的变量a和b是什么? #包括 结构向量2 { int x,y; }; 结构向量4 { 公众: 联盟 { 结构 { 整数x,y,z,w; }; 结构 { 向量2a,b; }; }; }; 无效打印向量(常量向量2和向量) { std::cout,c++,visual-c++,c++17,C++,Visual C++,C++17,初始化{1,2,3,4}使联合中的第一个结构成为活动成员 语句vector4.x=1;有效,因为您正在操作活动成员的元素 读取vector4.a的行为是未定义的,因为联合中的第二个结构不是活动成员 在C++中不允许通过“联盟< /代码>类型的双关”。换句话说,代码> a < /> >和 b>代码>没有值。 技术上,这是未定义的行为,但大多数编译器将支持它(): 从非最近编写的联合成员中读取是一种未定义的行为。许多编译器将读取联合的非活动成员作为非标准语言扩展实现 下面是一个简单的示例,说明了相同
{1,2,3,4}
使联合中的第一个结构成为活动成员
语句vector4.x=1;
有效,因为您正在操作活动成员的元素
读取vector4.a
的行为是未定义的,因为联合中的第二个结构
不是活动成员
在C++中不允许通过“<代码>联盟< /代码>类型的双关”。换句话说,<>代码> a < /> >和<代码> b>代码>没有值。 技术上,这是未定义的行为,但大多数编译器将支持它():
从非最近编写的联合成员中读取是一种未定义的行为。许多编译器将读取联合的非活动成员作为非标准语言扩展实现
下面是一个简单的示例,说明了相同的概念,没有额外的结构:
#include<iostream>
struct Vector2
{
int x, y;
};
struct Vector4
{
public:
union
{
struct
{
int x, y, z, w;
};
struct
{
Vector2 a, b;
};
};
};
void PrintVector(const Vector2& vector)
{
std::cout << vector.x << ", " << vector.y << std::endl;
}
int main()
{
Vector4 vector4 = { 1,2,3,4 };
vector4.x = 50;
PrintVector(vector4.a);
std::cin.get();
}
联合示例联合{
INTA;
int b;
};
int main()
{
例e;
e、 a=1;
//这将打印1,因为b与a占用相同的内存。
STD::虽然这个技巧并不少见,而且似乎在过去,在一个或其他编译器中是有效的。我相信它是用来提供类似的东西的。有时候,C++中的类型禁止是非常有害的。函数忽略vector4.a并执行函数的内容?@SeungYup26未定义的行为意味着它没有定义(关于语言标准)什么PrintVector()
实际上是这样。它最多可以打印一个包含vector4.x
和vector4.y
内容的Vector2。它也可以打印任何内容或崩溃。
union ExampleUnion {
int a;
int b;
};
int main()
{
ExampleUnion e;
e.a = 1;
// This will print 1, since b occupies the same memory as a.
std::cout << e.b << std::endl;
}