关于“联合初始化”的思考

一、问题的引出

《C和指针》关于“联合”一章中提到“联合变量可以被初始化,但这个初始值必须是联合第1个成员的类型”。

就这个问题,我有两点疑问:

  • 这里的‘初始化’是指在定义时对变量赋值吗?
  • 在定义之后是否可以显示地对其他成员(非第1个成员)赋值?

对此,我进行了一些简单的打印实验:

二、简单的打印实验

实验1代码:

#include <stdio.h>

int main(int argc, char *argv[])
{
	union {
		float f;
		int i;
	}fi = {3.14159};

	printf("%d\n",fi.i);
	printf("%f\n",fi.f);
	return 0;
}

实验1结果:

实验2代码:

#include <stdio.h>

int main(int argc, char *argv[])
{
	union {
		float f;
		int i;
	}fi = {3};

	printf("%d\n",fi.i);
	printf("%f\n",fi.f);
	return 0;
}

实验2结果:

实验3代码:

#include <stdio.h>

int main(int argc, char *argv[])
{
	union {
		float f;
		int i;
	}fi;

	fi.f = 3.14159;

	printf("%d\n",fi.i);
	printf("%f\n",fi.f);
	return 0;
}

实验3结果:

实验4代码:

#include <stdio.h>

int main(int argc, char *argv[])
{
	union {
		float f;
		int i;
	}fi;

	fi.f = 3;

	printf("%d\n",fi.i);
	printf("%f\n",fi.f);
	return 0;
}

实验4结果:

实验5代码:

#include <stdio.h>

int main(int argc, char *argv[])
{
	union {
		float f;
		int i;
	}fi;

	fi.i = 3;

	printf("%d\n",fi.i);
	printf("%f\n",fi.f);
	return 0;
}

实验5结果:

三、小结和发现

1.由实验2可知:整型“3”会转换为float类型,然后赋值给fi.f

2.对比实验1和实验3可知,初始化时赋值fi.f和之后显示赋值的效果是相同的。

3.对比实验2和实验4,可以进一步证实第1点发现,即:整型“3”会转换为float类型,然后赋值给fi.f

4.由实验5可知:非初始化时(即不在联合定义时)可以对其他成员变量进行赋值,比如此处的fi.i

由此,也可以回答文章开始的两个问题了:

  • 这里的‘初始化’是指在定义时对变量赋值
  • 在定义之后可以显示地对其他成员(非第1个成员)赋值,如实验5
时间: 2024-08-18 00:07:35

关于“联合初始化”的思考的相关文章

Git初始化之思考git config命令的各参数有何区别

在之前出现的git config 命令中,有的使用 --global 参数,有的使用了 --system 参数,这两个参数有什么区别吗?执行下面的一系列命令后,你就会明白使用不同参数的 git config 命令实际操作的文件了. 执行下面的命令,将打开 /path/to/my/workspace/demo/.git/config 文件进行编辑. $ cd /path/to/my/workspace/demo/ $ git config -e 执行下面的命令,将打开 /home/fuhd/.gi

Git初始化之思考是谁完成的提交

前面一开始先为Git设置了全局配置变量 user.name 和 user.email,如果不设置会有什么结果呢?执行下面的命令,删除Git全局配置文件中关于user.name和user.email的设置: $ git config --unset --global user.name $ git config --unset --global user.email 这样一来,关于用户姓名和邮件的设置都被清空了,执行下面的命令将看不到输出: $ git config user.name $ git

Git初始化之思考为什么工作区根目录下有一个.git目录

Git的一个显著特点是,版本库位于工作区的根目录下.对于Git来说,版本库位于工作区根目录下的 .git 目录中,且仅此一处,在工作区的子目录下则没有任何其他跟踪文件或目录. Git这种将版本库放在工作区根目录下的设计使得所有的版本控制操作(除了与其他远程版本库之间的互操作)都在本地即可完成,不像Subversion只有寥寥无几的几个命令脱离网络执行.而且,Git没有CVS和Subversion中存在的安全泄漏问题(只要保护好 .git 目录). Git将版本库(.git目录)放在工作区根目录下

Git初始化之思考命令别名是干什么的

前面,我们通过对 alias.ci 等Git配置变量的设置为Git设置了命令别名.命令别名可以帮助用户解决从其他版本控制系统迁移到Git后的使用习惯问题.CVS和Subversion等在提交的时候,一般习惯使用 ci (check in)子命令,在检出的时候则习惯使用 co (check out)子命令.如果Git不能提供对 ci 和 co 这类简洁命令的支持,对于拥有其他版本控制系统使用经验的用户来说,Git的用户体检就会打折扣.幸好聪明的Git提供了别名机制,可以满足用户特殊的使用习惯. 前

构建之法阅读笔记01

发布日期:2017.6.16 1.1节通过3个简短的对话和一个生活实例,启发我对什么是程序,什么是软件,什么是软件工程,没有使用到算法需不需要学习.掌握,软件和算法,数据结构有无关联等问题的思考.仔细想想发现自己对这些概念模糊,毫无理解.通过继续往下看,我才渐渐的明白了一行行的代码是源程序,能满足各种功能的是应用软件,能保证维修的是软件服务-..也了解到了一个软件不是简简单单就能说写就写的,还需要考虑各种因素,如人们的需求,功能的可行性.当软件团队通过通力合作,克服重重困难写出软件后,需要考虑软

c语言拾遗

枚举常量: 枚举是一个常量整型值的列表的列表,例如 enum boolean{NO,YES}: 在没有显示说明的情况下,enum类型中第一个枚举名的值为0,第二个为1,以此类推. 如果只指定了部分枚举名的值,那么未指定的枚举名的值将依着最后一个指定值递增,步长为1. enum days {one = 1, two=3, three}; enum days day = one; //或enum{one=1, two=3, three}day; printf("%d %d %d",day,

构建之法

通过第一章,我大概了解我将要从这本书中学习什么,如何落实学习.本书的作者——邹老师,通过设定简单的人物和简短的话语,使得书本远离枯燥无味,同时还条理清晰,这加强了我看书的耐心. 1.1节通过3个简短的对话和一个生活实例,启发我对什么是程序,什么是软件,什么是软件工程,没有使用到算法需不需要学习.掌握,软件和算法,数据结构有无关联等问题的思考.仔细想想发现自己对这些概念模糊,毫无理解.通过继续往下看,我才渐渐的明白了一行行的代码是源程序,能满足各种功能的是应用软件,能保证维修的是软件服务…..也了

《构建之法——现代软件工程》读后感

通过第一章,我大概了解我将要从这本书中学习什么,如何落实学习.本书的作者——邹老师,通过设定简单的人物和简短的话语,使得书本远离枯燥无味,同时还条理清晰,这加强了我看书的耐心. 1.1节通过3个简短的对话和一个生活实例,启发我对什么是程序,什么是软件,什么是软件工程,没有使用到算法需不需要学习.掌握,软件和算法,数据结构有无关联等问题的思考.仔细想想发现自己对这些概念模糊,毫无理解.通过继续往下看,我才渐渐的明白了一行行的代码是源程序,能满足各种功能的是应用软件,能保证维修的是软件服务…..也了

第五次 作业

构建之法观后感 通过第一章,我大概了解我将要从这本书中学习什么,如何落实学习.本书的作者——邹老师,通过设定简单的人物和简短的话语,使得书本远离枯燥无味,同时还条理清晰,这加强了我看书的耐心. 1.1节通过3个简短的对话和一个生活实例,启发我对什么是程序,什么是软件,什么是软件工程,没有使用到算法需不需要学习.掌握,软件和算法,数据结构有无关联等问题的思考.仔细想想发现自己对这些概念模糊,毫无理解.通过继续往下看,我才渐渐的明白了一行行的代码是源程序,能满足各种功能的是应用软件,能保证维修的是软