当前位置: 首页 > news >正文

操作符和表达式求值

目录

1.运算符的优先级和结合性

 1.1运算符的优先级

1.2结合性

2.操作符的使用最终带来的是一个表达式的值

2.1.隐式类型转换(整型提升)

2.1.1整形提升的例子

2.2算术转换


1.运算符的优先级和结合性

  • 运算符是编程语言中的基本元素之一,主要是为了让程序可以对数据进行各种各样的操作和计算。运算符可以用来进行算术运算、比较、逻辑判断、赋值等操作,可以让程序更加灵活和高效。
  • 例如,算术运算符可以用来进行加、减、乘、除等数学运算,比较运算符可以用来比较两个数的大小关系,逻辑运算符可以用来进行与、或、非等逻辑判断,赋值运算符可以用来将数据保存到变量中等。
  • 因此,运算符是编程语言中非常重要的组成部分,它们可以让程序可以更加方便、快速地处理数据和实现各种算法和逻辑。

 1.1运算符的优先级

运算符一览表中,运算符越靠上,优先级越高。例如,进行乘除法运算的★和/比进行加减法运算的+和–优先级高,这与我们实际生活中使用的数学规则是一样的。

例如:a +b * c

会被解释为a + (b * c),而不是(a + b) * c。虽然+写在前面,但还是先进行*的运算。

1.2结合性

这里有必要对结合性作一下说明。假如用〇表示需要两个操作数的双目运算符,那么对于表达式

a O b O c

左结合运算符会将表达式解释为:

(a O b) O c

右结合运算符会将表达式解释为:

a O (b O c)

也就是说,遇到优先级相同的运算符时,结合性指明了表达式应从左往右运算还是从右往左运算。

例如,执行减法计算的双目运算符–是左结合性的,所以:

5 - 3 - 1→(5 - 3) - 1  /*左结合性*/

如果为右结合性,就会解释为5-(3-1),答案就不正确了。执行赋值操作的简单赋值运算符=是右结合性的,所以解释如下:

a = b = 1 →a = (b = 1) /*右结合性*/

2.操作符的使用最终带来的是一个表达式的值

2.1.隐式类型转换(整型提升)

C的整型算术运算总是至少以缺省整型类型的精度来进行的。

为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。

整型提升的意义:

//实例1
char a,b,c;
...
a = b + c;
//b和c的值被提升为普通整型,然后再执行加法运算。
//加法运算完成之后,结果将被截断,然后再存储于a中。

如何进行整体提升呢?

整形提升是按照变量的数据类型的符号位来提升的

2.1.1整形提升的例子

例1:

//实例1
int main()
{char a = 0xb6;short b = 0xb600;int c = 0xb6000000;if(a==0xb6)printf("a");if(b==0xb600)printf("b");if(c==0xb6000000)printf("c");return 0;
}

实例1中的a,b要进行整形提升,但是c不需要整形提升 a,b整形提升之后,变成了负数,所以表达式 a==0xb6 , b==0xb600 的结果是假,但是c不发生整形提升,则表 达式 c==0xb6000000 的结果是真. 所程序输出的结果是:

 分析:

首先a的二进制表示如下:

char a=-74   原码:1011 0110(有符号数,第八位为符号位)

得到其补码:1100 1010——>(整型提升)——> 111111111111111111111111 11001010(补码)该补码表示的数字是  -54!=-74.

同方法可得出前两个if判断都为假

只有最后为int类型的c不会发生整型提升,因此判断为真输出结果为c。


例2:

//实例2
int main()
{char c = 1;printf("%u\n", sizeof(c));printf("%u\n", sizeof(+c));printf("%u\n", sizeof(-c));return 0;
}

 分析:

实例2中的,c只要参与表达式运算,就会发生整形提升

表达式 +c ,就会发生提升,所以 sizeof(+c) 是4个字 节.

表达式 -c 也会发生整形提升,所以 sizeof(-c) 是4个字节

但是 sizeof(c) ,就是1个字节

2.2算术转换

如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类 型,否则操作就无法进行。下面的层次体系称为寻常算术转换。

 如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运算。

但是算术转换要合理,要不然会有一些潜在的问题。

float f = 3.14;
int num = f;//隐式转换,会有精度丢失

感谢您的支持,以上便是今天全部内容,希望对你有所帮助。

http://www.lryc.cn/news/125233.html

相关文章:

  • Unity Spine帧事件
  • AE使用(一)
  • YOLOv5、YOLOv8改进:MobileViT:轻量通用且适合移动端的视觉Transformer
  • 06-4_Qt 5.9 C++开发指南_MDI应用程序设计
  • 【SCI征稿】3区SCI,正刊,智能传感、机器学习、智能检测与测量等均可
  • 神经网络ANN(MLP),CNN以及RNN区别和应用
  • CUDA、cuDNN以及Pytorch介绍
  • 使用shift关键字,写一个带二级命令的脚本(如:docker run -a -b -c中的run)
  • MySQL学习笔记 - 进阶部分
  • 微信小程序实现左滑删除
  • 安防视频监控有哪些存储方式?哪种存储方式最优?
  • 02-C++数据类型-高级
  • Kotlin实战之获取本地配置文件、远程Apollo配置失败问题排查
  • TCP协议的报头格式和滑动窗口
  • java 使用log4j显示到界面和文件 并格式化
  • 【js】链接中有多余的怎么取出参数值
  • Verdi_traceX and autotrace
  • 安卓逆向 - 某严选app sign算法还原
  • arcgis数据采集与拓扑检查
  • 【前端 | CSS】滚动到底部加载,滚动监听、懒加载
  • word将mathtype公式批量转为latex公式
  • docker-compose部署nacos 2.2.3
  • 软件测试52讲-学习笔记
  • 【ARM 嵌入式 编译系列 4 -- GCC 编译属性 __read_mostly 详细介绍】
  • Maven在IDEA2021版本中全局配置(一次配置处处生效)
  • 名侦探番外——Arduino“炸弹”引爆摩天大楼
  • 自适应AI chatgpt智能聊天创作官网html源码
  • 防抖,节流
  • 【Linux】多线程1——线程概念与线程控制
  • 【Maven】SpringBoot项目使用maven-assembly-plugin插件多环境打包