关于一个C语言共用体赋值问题

#include<stdio.h>
#include<stdlib.h>

void main()
{
union tag
{
int i;
float f;
char c;
};
union tag u1,u2;
u1.i = 100;
u1.f = 31.4;
u1.c = '1';
printf("%d %5.2f %c",u1.i,u1.f,u1.c);

}教科书上说输出结果中只有成员c具有确定值,而成员i ,f的值不可预料的,我在VC6上运行的结果显示c f 的值是确定的,与原值相同,i 不确定,这是为什么,求指教

教科书说的理论上是没有错的,因为联合体中各变量是共用内存的,一个联合变量的长度等于各成员中最长的长度,联合变量可被赋予任一成员值,但每次只能赋一种值, 赋入新值则冲去旧值。
http://hi.baidu.com/hsyl/blog/item/3a9af91900a43376dbb4bdf0.html/cmtid/94dc8b82ebba7a9ff703a6f2
出现你这种情况的原因可能是:int占4位,float占4位,char占1位,当赋值float后int的就完全更改了,当赋值char的时候,其实float的值也是更改了的,但是char因为占的位少,可能只改变了float的低位空间,也就是小数点后很多位的值,这样输出来的时候因为float就显示小数点后的几位,很后面的就被约为0了,所以结果没有变
温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-03-05
首先:在我们常用的系统中,存放的变量经常是从右向左存放的.
比如你定义了c1和c2
那么在计算机内存是这样的顺序:
c2,c1
你的共用体好像有个问题,我没发现X的定义
不过我假设你的X是个int,那么x与C2,C1共用同一块内存,这就是共用体的意思
当你给x赋值,也是给C2,c1赋值,
并且0x12放到了C2的位置,34放到了C1位置
所以,就产生了你所说的结果
第2个回答  2012-03-04
这一点教科书说的是对的

只有成员c值是可确定的,其余成员的值在不同的编译器,不同的编译选项下结果可能不同

主要是字节序的问题,也就是使用大端模式还是小端模式的问题追问

主要是字节序的问题,也就是使用大端模式还是小端模式的问题 ?这是什么意思?我是菜鸟,不要见笑。

追答

总之就是只有i指可以确定,但是其他的成员值在不同的编译器下结果可能不同

字节序什么的,自己百度,懒得解释了

第3个回答  2019-08-20
{

char
a
=
'a';

char
a
=
'b'
;//落了一个分号

return
0;
}
首先
,你第三行落了一个分号;
其次
,c语言多次赋值是允许的,但重复定义是不允许的。
char
a='a';//定义了a,且赋了初值‘a’
char
a='b';//重复定义了a
最后
,你想多次赋值时不需要加上类型修饰符,那样是定义变量。
例如定义a,并赋初值'a',第二次赋值'b',覆盖其初值
char
a='a';//定义了a,且赋了初值‘a’;
a='b';//再次给a赋值'b',覆盖了它的初值'a';
相似回答