C语言操作符(二)

目录

一、结构体

 1.什么叫结构体

2.写结构体

3.(.)结构体成员访问操作符 

二、优先级、结合性

1.优先级

2.结合性

三、整型提升

1.整型提升的概念

2.意义

3.如何进行整型提升

4.算数转换


一、结构体

 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语言中一些难以理解的操作符和其中的用法就讲完了,我有可能会忽略一些点,欢迎大家点评,我们一起进步,接下来我会制作指针专栏,也同样欢迎大家来学习,阅读。

  • 30
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值