#include <stdio.h>
union p{
int x;
float y;
};
int main()
{
union p p;
p.x = 10;
printf("%f\n", p.y);
return 0;
}
Выход:печать переменной объединение - странное поведение
0,000000
Когда я пытаюсь скомпилировать выше программ, она не показывает каких-либо предупреждений, даже в основной функция. Почему printf
не печатает значение 10.00000
?
Я прочитал некоторые связанные вопросы по StackOverflow который объясняет поведение printf
при печати целого числа без типажей с поплавком спецификатором, но я думаю, что здесь другой случай. Я печатаю число с плавающей точкой с помощью спецификатора float. Он должен напечатать правильное значение. Может ли кто-нибудь объяснить, что здесь происходит?
Поскольку представление памяти для int и поплавка отличается (проверьте с вашим отладчиком, и вы увидите). Кроме того, запись p.x и доступ к p.y - это неопределенное поведение ... –
@AdrianoRepetti; 'accessing p.y - неопределенное поведение': Нет. В этом случае нет. – haccks
@haccks AFAIK это не так, если 'int' и' float' имеют одинаковый размер (фактически, если они являются _compatible types_), но они не требуются (и здесь это неизвестно, потому что это зависит от среды). Если я не ошибаюсь ... –