C语言中的表达式求值

        在我们编程的过程中,经常会遇到不同类型的数据之间进行计算,那么如果我们想要预期结果和实际结果相同的话,我们自己首先得知道要怎么计算,这一篇,我来讲一讲表达式求值的那点事,欢迎大家先点赞后阅读啊

首先我们要先提出几个名词:

  1. 整型提升
  2. 算术提升
  3. 优先级和结合性

表达式求值的顺序一部分由操作符的结合性和优先级决定,但是,在有些表达式求值的过程中,数据需要转换成其他类型的数据

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.操作符的属性

复杂表达式的三个影响因素有:

  1. 操作符的优先级
  2. 操作符的结合性
  3. 是否控制求值顺序
     

两个相邻的操作符先执行哪一个取决于操作符的优先级,如果优先级相同,那么由结合性进行决定

控制求值顺序的操作符有三目操作符,逻辑与,逻辑或操作符

对于一个表达式,如果根据优先级和结合性不能确定唯一的计算顺序,那么这个表达式一定是有问题的

咱就简述了表达式求值的问题,优先级和结合性的表格大家百度就能找到了,我就不再重复粘贴了

欢迎各位uu的指正和建议

你可能感兴趣的