聯合體(共同體)

#include <iostream>
#include <cstdint>
union S
{
	std::int32_t n;     // 佔用 4 字節
	std::uint16_t s[2]; // 佔用 4 字節
	std::uint8_t c;     // 佔用 1 字節
};                      // 整個聯合體佔用 4 字節

int main()
{
	S s = { 1 }; // 初始化首個成員, s.n 現在是活躍成員
						  // 於此點,從 s.s 或 s.c 讀取是未定義行爲
	std::cout << std::hex << "s.n = " << s.n << '\n';
	std::cout << std::hex << "s.s = " << s.s << '\n';
	std::cout << std::hex << "s.c = " << s.c << '\n';
	s.s[0] = 0x0011; // s.s 現在是活躍成員
					 // 在此點,從 n 或 c 讀取是 UB 但大多數編譯器都對其定義
	std::cout << "s.c is now " << +s.c << '\n' // 11 或 00 ,依賴平臺
		<< "s.n is now " << s.n << '\n'; // 12340011 或 00115678
	getchar();
	return 0;
}

共同操作一塊內存,每個成員可以輪流活躍,比如,union表示工作類型時,用char【32】表示教師,用int表示學生,需要不同結果表示同一類型時,可以使用union。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章