我可以把变量留在C++中未定义的结构中吗?

我可以把变量留在C++中未定义的结构中吗?,c++,C++,我已经定义了这样一个结构 Struct rectangle{ int x; int y; int z; }; 然后在我的主要方法中,我将分配变量: void main(int argc, const char *argv[]) { for(i=0;i<20;i++) { rectangle[i].x = 20; rectangle[i].y = 10; } } 但是我不会在任何时候分配struct的'z'变量。我可以这样做吗? 希

我已经定义了这样一个结构

Struct rectangle{

int x;
int y;
int z;

};
然后在我的主要方法中,我将分配变量:

void main(int argc, const char *argv[])

{

   for(i=0;i<20;i++)

   {

     rectangle[i].x = 20;
     rectangle[i].y = 10;

    }

}
但是我不会在任何时候分配struct的'z'变量。我可以这样做吗? 希望我不是在问一些非常愚蠢的问题


提前谢谢

是的,很好。任何使用矩形[i].z的尝试都会导致未定义的行为,*但只要您不尝试使用它,这不是问题


*除非矩形被声明为全局/静态数组,否则在这种情况下,其所有成员都隐式初始化为零。

是的,可以。任何使用矩形[i].z的尝试都会导致未定义的行为,*但只要您不尝试使用它,这不是问题


*除非矩形被声明为全局/静态数组,否则在这种情况下,其所有成员都隐式初始化为零。

您可以这样做。但成员z将具有不确定的值。 因此,如果您使用它,而不给它赋值,您将得到一个未定义的BehaviorUB


但是,如果结构对象是全局或静态对象,则z将隐式初始化为0,您不必担心UB。

允许您这样做。但成员z将具有不确定的值。 因此,如果您使用它,而不给它赋值,您将得到一个未定义的BehaviorUB


但是,如果structure对象是全局或静态对象,那么z将被隐式初始化为0,您不必担心UB。

如前所述,它不会有什么坏处。您甚至可以打印矩形[i].z的值,以查看堆栈上以前的内容:。

如前所述,这不会有什么坏处。您甚至可以打印矩形[i]。z的值以查看堆栈上以前的内容:。

是的,您可以不声明z就离开,但z的值将未定义


请考虑为结构使用默认构造函数,并将矩形z定义为global或static将其初始化为0,这样您就不必担心它将采用的值。

是的,您可以不声明z,但z的值将未定义


考虑为结构使用默认构造函数,并将矩形z定义为gloabal或static,将其初始化为0,这样您就不必担心它将采用的值。

规范说读取未初始化的对象将生成UB 4.1/1,但规范也明确规定z将默认初始化为8.5/11。因此,我认为glvalue prvalue转换本身不是UB。例如,这应该得到很好的定义:if std::numeric_limits::trap==false{unsigned x;unsigned y=x+x;}。另一方面,使用int执行上述操作可能是UB,不是因为4.1/1,而是因为它可能会溢出,从而导致int的UB。规范说,读取未初始化的对象会生成UB 4.1/1,但规范也明确表示z将默认初始化为8.5/11。因此,我认为glvalue prvalue转换本身不是UB。例如,这应该得到很好的定义:if std::numeric_limits::trap==false{unsigned x;unsigned y=x+x;}。另一方面,使用int执行上述操作可能是UB,不是因为4.1/1,而是因为它可能会溢出,从而导致int的UB。