2017-03-18 122 views
3

我在高中学习,我做节目只是为了了解如何工会的工作,但该计划是给我意想不到的效果。意外导致工会(C++)

这是程序:

#include <iostream> 
using namespace std; 

union c{ 
    int l; 
    int b; 
    int h; 
    int vol; 
}; 

int main() { 
    c box; 
    box.l=1; 
    box.b=2; 
    box.h=3; 

    box.vol = box.l*box.b*box.h; 

    cout<<"\n Volume :- "<<box.vol; 
    return 0; 
} 

和输出如下:

Volume :- 27 

我想明白为什么会这样。

+4

我认为你应该重新考虑工会的工作方式。 – skypjack

+0

为什么?如果有任何错误,请告诉我 – Fullatron

+1

您的期望是错误的。你不能设置一个工会的所有成员,并期望他们保留他们的价值观。为此使用一个结构。一个工会的成员(让我说)是独占的,你可以使用第一个**或**第二个,等等。这将是一个UB,但事实上它给了你一个可预测的结果,因为它们都是'int'。无论如何,正如我所说的,你的期望是错误的,而不是结果。 – skypjack

回答

3

你有这个问题,因为你是治疗union,就好像是一个struct

一个联盟分配的内存空间,可容纳这些单元的任意但不是所有他们的。按照您编写它的方式,有三个名称可以有效地指向相同的地址。这意味着,根据作业,最终将3分配到分配的空间中。

换句话说,你已经写了这个方式,你简单地创建引用相同数据的四种方式。

的方式来使用一个联合将描述两个或多个交替的结构的一个例子。例如:

union Shape { 
    struct triangle { 
    int base; 
    int height; 
    } 
    struct rectangle { 
    int length; 
    int width; 
    } 
} 

您现在可以使用单一数据类型来处理这两种情况。

+0

所以你可以给我一个工会的程序,做同样的工作,作为一个结构会做在这里? – Fullatron

+0

实际上,在大多数情况下我使用结构...我不习惯工会:P – Fullatron

+1

你不会为你想要做的工作使用联合。 –

0

联合是在C语言中的特殊数据类型,它允许不同的数据类型储存在同一存储器位置。您可以定义包含许多成员的联合,但只有一个成员可以在任何给定时间包含值。联盟提供了一种有效的方式来使用多个用途的相同的内存位置。

工会标签是可选的,并且每个部件定义是一个正常的变量定义,例如int I;或浮动f;或任何其他有效的变量定义。在联合定义的末尾,在最终分号之前,可以指定一个或多个联合变量,但它是可选的。这里是你需要定义有三个成员I,F,和STR名为Data的联合类型的方式 - 现在

union Data { 
    int i; 
    float f; 
    char str[20]; 
} data; 

,数据类型的变量可以存储整数,浮点数字或字符串的字符。这意味着可以使用单个变量,即相同的存储位置来存储多种类型的数据。根据您的要求,您可以在联合中使用任何内置或用户定义的数据类型。

+0

哦,现在我知道了......这可以称为工会的限制吗? – Fullatron

+2

@Fullatron,这不是*限制,而是* union的目的*。如果你不想要这种内存共享行为(这是99.99%的情况),你可以使用'struct'或'class'。 –

+0

嗯,我想你是对的..但这也限制了使用... – Fullatron

相关问题