Вывод равен 7.1, мне было интересно, кто-нибудь может объяснить, почему вывод равен 7.1, а не 3.5.
Все члены объединения имеют один и тот же адрес памяти.Когда вы устанавливаете значение любого члена объединения, оно изменяет значение по этому адресу памяти, и, поскольку все члены сопоставляются с этим адресом, при чтении значения оно будет отражать последнее значение, которое было записано вэтот адрес.
С этой строкой:
mydata.var1 = 'B';
Вы устанавливаете значение этой памяти равным 0x42, а затем следующей строкой:
mydata.var2 = 12;
Вы устанавливаете значениеиз этой памяти до 12, так что, когда вы получите здесь:
if(mydata.var1 == 'B')
mydata.var3 = 3.5;
else
mydata.var3 = 7.1;
Предложение else
выполняется, и теперь значение этой памяти установлено в 7.1.
Вотбольшая проблема с вашим кодом: использование объединения между char, int и float не имеет смысла
Причина относительно проста: объем памяти, необходимый для членов,разные.
Объем памяти, необходимый для char
, составляет 1 байт, так как это наименьшая адресуемая единица для машины, на которой выполняется код.Объем памяти, необходимый для int
(он же со знаком int), составляет по крайней мере 2 байта или 16 бит, но в настоящее время на большинстве компьютеров это 4 байта или 32 бита.Память, необходимая для float
на большинстве машин, составляет 4 байта или 32 бита из-за двоичного формата с плавающей запятой IEEE 754 с одинарной точностью.Значения, которые могут представлять сами члены, также совершенно разные.Подписанное char
обычно [-128, 127].int
со знаком, предполагая 32 бита, составляет [-2217483,647, +2,147,483,647], а float
равно [1,2 * 10 ^ -38, 3,4 * 10 ^ 38].Однако, по крайней мере, float
и int
, вероятно, будут иметь одинаковый размер, так что union
, содержащий их, имеет больше смысла.
Я понимаю, что это, вероятно, образовательное или начинающее упражнение, однако этоупражнение, в котором не удалось выделить цель union
и правильное ее использование.
Способ использования union
состоит в том, чтобы интерпретировать одни и те же данные по-разному.
Типичным примером является то, сколько сетевых API будет определять объединение для адресов IPv4
union ipv4addr {
unsigned address;
char octets[4];
};
Это обеспечивает гибкость при передаче этой информации функции.Возможно, определенная функция заботится только о 32-битном значении, а другая - только о конкретных байтах в этом 32-битном значении.
Я рекомендую прочитать этот ответ и этоттакже для получения дополнительной информации о том, почему union
полезен и как правильно применяется .