关于一个C语言共用体赋值问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于一个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了,所以结果没有变 参考技术A 首先:在我们常用的系统中,存放的变量经常是从右向左存放的.
比如你定义了c1和c2
那么在计算机内存是这样的顺序:
c2,c1
你的共用体好像有个问题,我没发现X的定义
不过我假设你的X是个int,那么x与C2,C1共用同一块内存,这就是共用体的意思
当你给x赋值,也是给C2,c1赋值,
并且0x12放到了C2的位置,34放到了C1位置
所以,就产生了你所说的结果 参考技术B 这一点教科书说的是对的
只有成员c值是可确定的,其余成员的值在不同的编译器,不同的编译选项下结果可能不同
主要是字节序的问题,也就是使用大端模式还是小端模式的问题追问
主要是字节序的问题,也就是使用大端模式还是小端模式的问题 ?这是什么意思?我是菜鸟,不要见笑。
追答总之就是只有i指可以确定,但是其他的成员值在不同的编译器下结果可能不同
字节序什么的,自己百度,懒得解释了
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';
C语言—联合体/共用体
联合体
联合体的定义
同一个内存空间存放类型不同,不同类型变量共享一块内存空间。
1.结构体元素有各自单独的空间
联合体元素共享空间,空间大小由最大类型确定
2.结构体元素互不影响
联合体赋值会导致覆盖
联合体的定义:
union testU
int a;
int b;
char c;
;
这里定义一个结构体,内容一样都是int a;int b; char c;
打印得到结构体和联合体的大小 + a.b.c三个变量的地址
这里就验证上面的定义。。。。。。。。。。。
联合体的应用
例题:有若干各人员的数据,其中包括学生和教师。
学生的数据包括:姓名、号码、性别、职业、班级。
教师的数据包括:姓名、号码、性别、职业、职务。
要求用同一个表格来处理。
这里只简单实现姓名和职业(班级)
#include <stdio.h>
struct Person
char name[32];
char zhiye;
union
int class;
char kemu[12];
mes;
;
int main()
struct Person p[2];
int i;
for(i=0;i<3;i++)
printf("请输入职业:t代表老师,s代表学生\\n");
scanf("%c",&(p[i].zhiye));
if(p[i].zhiye == 's')
printf("请输入学生名字:\\n");
scanf("%s",p[i].name);
printf("请输入学生班级:\\n");
scanf("%d",&(p[i].mes.class));
else
printf("请输入老师名字:\\n");
scanf("%s",p[i].name);
printf("请输入老师科目:\\n");
scanf("%s",p[i].mes.kemu);
getchar();
for(i=0;i<3;i++)
if(p[i].zhiye == 's')
printf("学生的姓名是:%s,班级是%d\\n",p[i].name,p[i].mes.class);
else
printf("老师的姓名是:%s,科目是%d\\n",p[i].name,p[i].mes.kemu);
return 0;
运行结果
以上是关于关于一个C语言共用体赋值问题的主要内容,如果未能解决你的问题,请参考以下文章