2017-03-18 93 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