关于一个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指可以确定,但是其他的成员值在不同的编译器下结果可能不同

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

参考技术C

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语言共用体赋值问题的主要内容,如果未能解决你的问题,请参考以下文章

c语言共用体包含一个数组成员,我要对这个数组成员进行赋值,一定要一个一个的赋值么?不能写在花括号

C语言共用体

c语言里,怎样判断共用体union的数据类型?

C++中为何不能对共用体变量名赋值?

关于c语言中联合体/共用体中数据存放的问题?

JavaScript 关于this的赋值问题