操作符的优先级

文章探讨了操作符在表达式求值中的特性,特别是整型提升的概念,以及在处理不同数据类型和大小的算数转换。它强调了优先级、结合性和控制求值顺序在复杂表达式求值中的作用。
摘要由CSDN通过智能技术生成

操作符问题补充

  • 表达式求值
    • 整型提升
    • 算数转换
    • 操作符的属性

表达式求值

  • 一般在操作符的时候,系统会根据不同的情况对一些表达式的求值方式有不同的影响,一般来讲,表达式的求值顺序一般可以根据操作符的优先级和结合型来决定,但往往还会产生不同的情况。

整型提升

先看这段代码:

	char a , b , c;
	scanf("%d %d ",&a,&b);
	c = a + b;
  • 可以思考一下,在三个char类型的字符相加,其过程应该是怎么样的?

这里我们需要了解一下整数提升的概念:
表达式的整型运算要在CPU(中央处理器)的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器长度。

  • 因此,即使俩个char类型的字符相加,在CPU执行时实际上也要转换为CPU、内整形操作数的标准长度。
	char a = '1';
	//char类型的补码:00110001
	//int类型的补码:00000000 00000000 00000000 00110001
	char b = '2';
	//char类型的补码:00110010
	//int类型的补码:00000000 00000000 00000000 00110010
	char c;
	c = a + b;
	printf("%d",c);
  • 假设如果俩个char类型的a和b,他们的补码都是非常大的俩个数,那么他们相加肯定大于一个字节的长度,此时整型提升的作用就体现出来了,俩个char类型的字符提升成int类型,所加的值保留在char类型中需要采取的措施就是阶段,即只保留一个字节,其他字节删除。

这里需要提示一下,通用CPU是难以实现俩个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中每个小于int类型的整型值,都必须先转换为int或者unsigned int,然后才能送入CPU计算。

  • 整型提升是按照变量的数据类型的符号为来提升的,整型提升有三种情况
  1. 负数的整型提升:高位补充符号位,即为1;
  2. 正数的整型提升:高位补充符号位,即为0;
  3. 无符号的整型提升:高位补充0.
  • 关于char类型:

1.有符号的char类型的取值范围是-128~127
2.无符号的char类型的取值范围是0~255

算数转换

  • 通过整数提升我们大概可以了解,在比小于int类型的字节长度在进行计算时CPU都会转化成int类型,那如果俩个大于int类型的数字,并且类型不匹配怎么办?这里就需要进行算数转换。
  • 算数准换:如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。

long double
double
float
unsigned long int
long int
unsigned int
int

  • 这些层次体系称为寻常算数准换,转换时从最下面的int向上转换。

操作符的属性

  • 复杂表达式的求值有三个影响因素:
  1. 操作符的优先级
  2. 操作符的结合性
  3. 是否控制求值顺序

这里需要提示一下:在进行复杂的表达式求值的时候,首先确定优先级,相邻操作符按照优先级高低计算;当优先级相等时,结合性起作用;最后看是否控制求值顺序。

操作符描述结合性是否控制求值顺序优先级
()聚组N/A1
()函数调用L-R2
[ ]下标引用L-R3
.访问结构指针成员L-R4
->函数调用L-R5
()++后缀自加L-R6
()-- –后缀自减L-R7
!逻辑取反R-L8
~按位取反R-L9
+()正值R-L10
-()负值R-L11
++ ()后缀自加R-L12
– --()前缀自减R-L13
*()间接访问R-L14
&取地址R-L15
sizeof求字节长度R-L16
(类型)类型转换R-L17
()*()乘法L-R18
/除法L-R19
%取模L-R20
()+()加法L-R21
()–()减法L-R22
()<<()左移L-R23
()>>()右移L-R24
()>()大于L-R25
()>=()大于等于L-R26
()<()小于L-R27
()<=()小于等于L-R28
==等于L-R29
!=不相等L-R30
&按位与L-R31
^按位异或L-R32
I按位或L-R33
&&逻辑与L-R34
II逻辑或L-R35
?:条件操作符N/A36
=赋值R-L37
+=以……加R-L38
–=以……减R-L39
*=以……乘R-L40
/=以……除R-L41
%=以……取模R-L42
<<=以……左移R-L43
()>>=以……右移R-L44
&=以……与R-L45
^=以……异或R-L46
I=以……或R-L47
,逗号L-R48
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值