目录
一、结构体
1.什么叫结构体
结构体:例如描述一本书需要从很多方面进行,这些方面又互不相同,所以C语言增加了结构体这种自定义的数据类型。
结构是一些值的集合,这些值成为成员变量,结构的每个成员可以是不同类型的变量。讲到这里应该会有人想到数组,数组也是集合,但他是相同类型的集合。
格式:
struct tag//struct是结构体的关键字,tag是自定义命名
{
member_list;//成员列表,至少有1个,如:char name [20];
}variable_list;//变量列表,这里可以写多个变量,不能忘记“;”
2.写结构体
在展示代码前,我想先给大家说一些细小的知识:
(1)结构体可以创建局部变量和全局变量
(2)变量列表里的是全局变量,如果在主函数内部是局部变量
结构体的声明:
struct student { char name[20]; int age; }s4,s5,s6;//变量列表,不能忘记有';',全局变量,如果在主函数内部为局部变量。 struct student s3 = {"wangwu",10};//全局变量 int main() { struct student s1 = { "zhangsan",20 }; struct student s2 = { .name = "lisi",.age = 18 }; printf("%s %d\n", s1.name, s1.age);//(结构体名称).(结构体成员名) printf("%s %d\n", s2.name, s2.age); }
结构体嵌套:
struct node { int a; struct point p; struct node* next; }n1 = { 10,{3,5},NULL }; struct node n2 = { 20,{6,9},NULL };
3.(.)结构体成员访问操作符
同时,借这个代码来展示今天要说的第一个操作符:”.“
使用方式:(结构体变量).(结构体成员名)
除此之外还有一个操作符:“-->”,但是由于这涉及到指针,所以我想将他放在之后的指针专栏里,有感兴趣的小伙伴可以关注一下。
二、优先级、结合性
1.优先级
优先级指的是,如果⼀个表达式包含多个运算符,哪个运算符应该优先执⾏。各种运算符的优先级是不⼀样的。
参考:https://zh.cppreference.com/w/c/language/operator_precedence
2.结合性
如果两个运算符优先级相同,优先级没办法确定先计算哪个了,这时候就看结合性了,则根据运算符是左结合,还是右结合,决定执行顺序。大部分运算符是左结合(从左到右执行),少数运算符是右结合(从右到左执行),比如赋值运算符( = )。
三、整型提升
1.整型提升的概念
整型提升:C语⾔中整型算术运算总是至少以缺省(默认)整型类型的精度来进行的。 为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型。
2.意义
表达式的整型运算要在CPU的相应运算器件内执⾏,CPU内整型运算器(ALU)的操作数的字节⻓度⼀ 般就是int的字节⻓度,同时也是CPU的通⽤寄存器的⻓度。
因此,即使两个char类型的相加,在CPU执⾏时实际上也要先转换为CPU内整型操作数的标准⻓ 度。 通⽤CPU(general-purpose CPU)是难以直接实现两个8⽐特字节直接相加运算(虽然机器指令中 可能有这种字节相加指令)。
所以,表达式中各种⻓度可能⼩于int⻓度的整型值,都必须先转换为 int或unsigned int,然后才能送⼊CPU去执⾏运算。
3.如何进行整型提升
(1)有符号整数提升是按照变量的数据类型的符号位来提升的。
(2)无符号整数提升,高位补0。
演示:
int main()
{
char a = 20;
//00000000000000000000000000010100-a的原码
//00010100,无符号整数,高位补0
char b = 130;
//00000000000000000000000010000010-b的原码
//10000010,因为高位是1,所以后面计算补1
char c = a + b;
//00000000000000000000000000010100
//11111111111111111111111110000010
//11111111111111111111111110010110-c
//10010110补码进行取反加1得原码。
//10000000000000000000000001101010:结果//-106
printf("%d\n", c);
}
在这里有小伙伴会问了,为什么两个整数会算出负数呢?因为这和char有关,char类型的取值范围在-128~127之间,是一个轮回。
4.算数转换
讨论的是大于等于整型类型的类型,当每个操作符的操作数不一样时,我们通常会将一个类型转换为另一个整型进行计算。
1.long double
2.double
3.float
4.unsigned long int
5.long int
6.unsigned int
从下向上转换,因为int最小。
那到这里C语言中一些难以理解的操作符和其中的用法就讲完了,我有可能会忽略一些点,欢迎大家点评,我们一起进步,接下来我会制作指针专栏,也同样欢迎大家来学习,阅读。