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 整型提升的意义
2.因此,即使两个char类型的相加,在CPU执⾏时实际上也要先转换为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。