操作符详解(2)

本文详细介绍了C语言中结构体的使用,包括其成员变量、声明、初始化(有序与无序)、嵌套结构体以及结构体成员的访问(直接和间接)和表达式求值规则,特别关注了整型提升的概念和意义。
摘要由CSDN通过智能技术生成

1. 结构体成员访问操作符

1.1 结构体

1.C语言中已经提供了内置类型,如char,short,int,long,float,double等,但是只有这些内置类型是不够的。假如我们描述一个学生需要名字,年龄,学号等信息。C语言为了解决这个问题,增加了结构体这种自定义的数据类型,让程序员可以自己创造适合的类型,即结构体。

2.结构体是一些值的结合,这些值称之为成员变量结构体的每个成员可以是不同类型的变量,如:标量、数组、指针、甚至是其他结构体。

3.结构体的关键字:struct

1.1.1 结构体的声明

1. 形式:

struct tag  //关键字+结构名
{
 member-list;   //结构体变量

}variable-list;   //这个也是结构体变量,不过是全局变量

2. 举例

struct student
{
  char name[20];    //名字
  int age;          //年龄
  float weight;     //体重 
  char id[16];      //学号
}; //这里的分号不能省略

从例子可以得知,应用结构体可以更好的说明物体信息的多样化。不同的信息可以根据实际情况用合适的变量类型创造合适的变量。

1.1.2 结构体变量的初始化

1. 无嵌套结构体的初始化

1.1 有序结构体的初始化

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
struct student
{
	char name[20];
	int age;
	int high;
	float weight;
	char id[16];
};
int main()
{
	struct student s1 = { "张三",20,180,75,"202315270128" }; //有序结构体的初始化
	printf("%s %d %d %d %s", s1.name, s1.age, s1.high, s1.weight, s1.id);
}

初始化方式:关键词struct+变量名+自己创造的变量名,初始化的信息要用{}包起来。

1.2 无序结构体的初始化

不按照固定顺序初始化变量要用到 .  操作符。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
struct student
{
	char name[20];
	int age;
	int high;
	float weight;
	char id[16];
};
int main()
{

	struct student s1 = { "张三",20,180,75,"202315270128" }; //有序结构体的初始化
	printf("%s %d %d %d %s", s1.name, s1.age, s1.high, s1.weight, s1.id);
	printf("\n");
struct student s2 = { .age = 30,.high = 75,.weight = 78,.id = "202315270128",.name = "张三" };
printf("%d %d %d %s %s", s2.age, s2.high, s2.weight, s2.id, s2.name);

}

1.1.3 有嵌套结构体的初始化

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
struct s
{
	char c;
	int n;
};
struct B
{
	struct s s1;
	int* p;
	char arr[10];
	float sc;
};
int main()
{
	struct B b = { {'w',99},NULL,"hehe",85.5f };
	printf("%d", b.s1.n);

1.2 结构体成员访问操作符

1.结构体成员的直接访问

结构体成员的直接访问是通过(.)点操作符访问的,点操作符接受两个操作数:

直接访问结构体成员的方式:结构体变量名.成员名

2.结构体成员的间接访问

使用方式:结构体指针—>成员名

2. 操作符的属性----优先级和结合性

C语言中的操作符有2个重要属性:优先级和结合性,这两个属性决定了表达式的求值的顺序。

2.1 优先级

优先级指的是如果一个表达式包含多个运算符,那个运算符应该优先执行。各种运算符的优先级是不一样的。

2.2 结合性

如果两个运算符优先级相同,就要看结合性。大部分运算符是左结合(从左向右执行),少数运算符右结合(从右到左执行),比如赋值运算符(=)。

运算符的优先级顺序很多,下⾯是部分运算符的优先级顺序(按照优先级从⾼到低排列),建议⼤概 记住这些操作符的优先级就⾏,其他操作符在使⽤的时候查看下⾯表格就可以了。
圆括号( ()
⾃增运算符( ++ ),⾃减运算符( --
单⽬运算符( + -
乘法( * ),除法( /
加法( + ),减法( -
关系运算符( < > 等)
赋值运算符( =
由于圆括号的等级最高,所以可以使用圆括号改变优先级。

3. 表达式求值

3.1 整型提升

C语言中整形算数运算总是至少以缺省整形类型的精度来进行的,为了获得这个精度,表达式中的字符和短整型操作数在使用之前会被转换为普通整形,这种转换称之为整型提升。

3.2 整型提升的意义

1.表达式的整型运算要 在CPU的相应运算器件内执⾏ CPU内整型运算器(ALU)的操作数的字节⻓度⼀般就是int的字节⻓度,同时也是CPU的通⽤寄存器的⻓度。

2.因此,即使两个char类型的相加,在CPU执⾏时实际上也要先转换为CPU内整型操作数的标准⻓

度。
3.通⽤CPU(general-purpose CPU)是难以直接实现两个8⽐特字节直接相加运算(虽然机器指令中 可能有这种字节相加指令)。所以,表达式中各种⻓度可能⼩于int⻓度的整型值,都必须先转换为 int或unsigned int,然后才能送⼊CPU去执⾏运算。

3.3 如何进行整型提升

1.有符号整型提升是按照变量的数据类型的符号位来提升的。

2.无符号整数,高位补0.

举例:

1. 有符号数的整型提升

char a = -1;变量a的二进制位有8个比特位,因为一个char的大小为一个字节,一个字节等于8个比特位,则-1的二进制位(补码)表示为11111111,因为char是有符号的变量,则按照变量的类型的符号位进行来提升,转换为整形,大小为4个字节,则转换为11111111111111111111111111111111

2.无符号数的整型提升

char b=1;变量b的二进制位有8个比特位,因为一个char的大小为一个字节,一个字节等于8个比特位,则-1的二进制位(补码)表示为00000001,因为char是有符号的变量,则按照变量的类型的符号位进行来提升,转换为整形,大小为4个字节,则转换为00000000000000000000000000000001。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值