在我们编程的过程中,经常会遇到不同类型的数据之间进行计算,那么如果我们想要预期结果和实际结果相同的话,我们自己首先得知道要怎么计算,这一篇,我来讲一讲表达式求值的那点事,欢迎大家先点赞后阅读啊
首先我们要先提出几个名词:
- 整型提升
- 算术提升
- 优先级和结合性
表达式求值的顺序一部分由操作符的结合性和优先级决定,但是,在有些表达式求值的过程中,数据需要转换成其他类型的数据
1.整型提升
对于在内存中所占字节小于int的数据,例如char,short类型的数据,在进行加减时会进行隐性转换,转换成int类型的数据后再进行加减。
//例如以下代码
char a = 3;
//3是int型数据,存放在char中会发生截断
//00000000000000000000000000000011(补码)
//截断后 00000011
short b = 5;
//short同理
//00000000000000000000000000000101(补码)
//截断后 00000101
int c = a + b;
//a,b要进行加减,需要进行整型提升
//a-> 00000000000000000000000000000011
//b-> 00000000000000000000000000000101
//再进行计算
scanf("%d\n", c);
整型提升前面添加的是1还是0由符号位说了算,不了解二进制码的同学请移步(11条消息) C语言数据的类型以及在内存中的储存_Joker2373的博客-CSDN博客
2.算术提升
对于在内存中所占字节大于int的数据,我们默认会进行数据的算术提升
因为两个数据类型不同是无法进行各种计算的,当然算术提升也是隐性的
- long double
- double
- float
- unsigned long int
- long int
- unsigned int
- int
依次向上提升
但是对于一些提升会存在潜在的问题,例如本是float类型的数据放在定义为int类型的变量中会发生数据精度的丢失
3.操作符的属性
复杂表达式的三个影响因素有:
- 操作符的优先级
- 操作符的结合性
- 是否控制求值顺序
两个相邻的操作符先执行哪一个取决于操作符的优先级,如果优先级相同,那么由结合性进行决定
控制求值顺序的操作符有三目操作符,逻辑与,逻辑或操作符
对于一个表达式,如果根据优先级和结合性不能确定唯一的计算顺序,那么这个表达式一定是有问题的
咱就简述了表达式求值的问题,优先级和结合性的表格大家百度就能找到了,我就不再重复粘贴了
欢迎各位uu的指正和建议