變量a由值10賦值,變量b由聯合變量v賦值20然後它給出的是20的輸出而不是10.我沒有得到它。用聯合變量分配兩個值
#include<stdio.h>
int main()
{
union var
{
int a, b;
};
union var v;
v.a=10;
v.b=20;
printf("%d\n", v.a);
return 0;
}
我執行程序,我得到20作爲輸出。
變量a由值10賦值,變量b由聯合變量v賦值20然後它給出的是20的輸出而不是10.我沒有得到它。用聯合變量分配兩個值
#include<stdio.h>
int main()
{
union var
{
int a, b;
};
union var v;
v.a=10;
v.b=20;
printf("%d\n", v.a);
return 0;
}
我執行程序,我得到20作爲輸出。
union
將所有列出的成員彼此重疊(儘管有些可能會延伸得比重疊的起始部分更遠),因此分配給.a
或.b
的內容正在寫入相同部分的內存。考慮到這一點,輸出應該是合理的。
你可能在想的struct
的行爲,如果你期待的10
輸出在真正扭曲的情況下,有可能同時有存放在工會的不同值的部分,但一般的部分覆蓋價值將被視爲腐敗。例如,這樣的:
union {
char a;
struct { char ba; char bb; } b;
} s;
可以同時存儲s.a
和s.b.bb
,但由於s.a
重疊s.b.ba
,在s.b.ba
分配給s.a
單塊,並暗示所有的s.b
不再是值得信賴的。
通常用於存儲不同類型的工會組織將被嵌入在一個結構,其第一成員記錄的聯合成員使用:
struct {
int type;
union {
char ch;
int n;
} datum;
} atom;
這裏,type
可能會包含一個枚舉值指示是否datum.ch
或datum.n
在原子中被使用。
一個union
從struct
區別這兩種方式:
int
,工會整體的小型化是int
)union
中。您存儲到v
的最後一個值是20
,所以應該打印union
的任何成員時獲得的值回。
如果您想要訪問兩個成員,那麼您應該使用struct
來代替。
你應該閱讀有關union
:
這將幫助你瞭解發生了什麼 - 基本上是union
的所有成員都存儲在相同地址在內存中。
這是一個有啓發性的問題。嘗試顛倒作業,如下:
v.b=20;
v.a=10;
並查看結果。如果你想a
和b
共存,而不是相互疊加,然後使用一個結構,如下:
#include<stdio.h>
int main()
{
struct var
{
int a, b;
};
struct var v;
v.a=10;
v.b=20;
printf("%d\n", v.a);
return 0;
}
,你應該得到的結果想。但是,var結構現在包含兩個整數。
假設,原始的int大小是32位。
C/C++中聯合數據類型的概念是:它使我們能夠將不同的數據類型存儲在同一個內存位置。我們可以定義與許多成員的聯盟,但是在任何給定時間只有一個成員可以包含值。聯盟的規模足以包含其中最大的成員。
你的情況:'a'&'b'是int類型,所以'var'union的大小是32位。
現在想象大小爲32的二進制數組。讓我們說A [32]。至少5個有效位存儲01010,即分配給'v.a'的10的二進制形式。接下來當你將20賦值給'v.b'時,10100(20的二進制形式)將替換爲01010.因此,當前union v在內存空間中有10100個。
當您訪問'v.a'時,它將返回該內存位置的當前值。
工會在同一時間,你可以分配一個值。在聯合中,這些值彼此重疊。所以你在爲兩個聯合元素賦值時做錯了。它將始終顯示最後分配的值。所以如果你正在訪問一個值,它會顯示最後更新的值。
不確定你在問什麼;但[Google](https://www.google.com/search?q=c+union)有很多關於C聯盟的信息 – 2013-08-19 04:11:18
謝謝@JensGustedt。我刪除了誤導評論(你只應該閱讀最近寫的字段) – Himanshu