大家好
欢迎继续学习C++语言程序设计
这一节给大家介绍
运算优先级以及类型转换
到现在为止我们已经学了
很多运算符了 这些运算符呢
如果在一个表达式中
进行混合运算的时候
它们的优先级是什么样的呢
这一级要给大家看一个优先级表
那么还有呢
当我们在同一个表达式中
出现了不同的操作数类型的时候
这个时候
它们能进行混合运算吗
比如说让整数和实数来做加法
那么这两个类型它就不一致
而加法运算符
要求参与运算的操作数
都是类型一致的
这个时候怎么办呢
这就出现一个类型转换问题
类型转换呢有隐含的转换
也叫引式转换
也有我们刻意在程序中
是指明要按这种方式转换的
那叫做显式的转换
接下来我给大家详细介绍
这部分内容
现在我们来看一下
这是一个运算符优先级的表
这个表里列出了
目前我们学过的
还包括一些没有学到的运算符
它的优先级
大家可以不用去背这个表
用多了你自然就记住了
需要的时候查阅一下就行了
这里面列出了它的优先级
以及结合信
结合信就是把它的运算次序
同级运算符从左向右
还是从右向左来计算
如果说我们在运算中
有不同类型的数据进行混合运算
这个时候就会发生
类型转换的问题
像算术运算符 关系运算符
逻辑运算符 位运算符
和赋值运算符
都要求两个操作数的类型要一致
如果在运算中
比如算术运算 关系运算中
如果你参与运算的操作数类型
是不一致的
那编译器首先就会根据
它各自的类型试图自动去进行
数据类型的转换
也就是我们说的隐含转换
隐含转换的基本原则呢
就是将第一类型的数据
转换为较高类型的数据
那么这里呢
我们列出了这些数据类型
由低到高的次序
所谓低类型呢
就是它表示数据范围
比较窄的类型
而高类型呢
就是它表示数据范围
比较宽的类型
那这个表里面呢
列出了隐含转换的一些条件
和情况
比如说有一个操作数
是long double类型的时候
那么另一个操作数
也会转化为long double类型
那不满足上述这个条件
且有一个操作数
是double类型的时候
另一个操作数
就转化为double类型等等
大家可以仔细看一下这个表
看一下隐含转换的
这些详细的规则
如果说我们要将一个
非布尔类型的算术值
赋值给布尔类型
那么算术值为0 结果就是false
否则如果这个算术值不为0
那结果就是true 就是真
反过来如果要将一个布尔值
赋值给非布尔类型的时候
布尔值flase被转换成0来赋值
布尔值true被转换成1来赋值
我们知道在C语言中呢
是没有布尔类型的
那在C语言中我们是用什么
是用0和1来表示逻辑值的假和真在C++中
有了布尔类型也要求
你在进行逻辑运算的时候
关系运算的时候
结果应该是布尔类型
但是由于这样一种自动的
转换的规则在C++中
仍然可以在需要布尔类型时候
去给它一个数值
或者在需要整数值的时候
去给它一个布尔类型
它们之间是可以转换
这样使得程序会非常灵活
当然对于不熟悉的初学者
有的时候也是给我们提供了
更多的出错的机会
大家用这种自动的转换要小心
而且要用得心理清楚明白
它在什么时候发生了
什么样的转换
那么如果浮点数跟整数之间
赋值的时候会怎么样呢
如果将一个浮点数赋值给
整数类型
那结果值就只保留
浮点数的整数部分
小数部分就被舍弃了
这个过程中不会发生舍入
不会发生四舍五入
就纯是把小数舍掉了
当把一个整数赋值给
浮点类型的时候
小数部分就记为0
整数部分就作为
浮点数的整数部分赋过去
除了隐式的类型转换呢
我们还可以用显式类型
转换的方式
显示类型转换在C++中
有三种形式
简单的形式
就直接写出类型说明符和表达式
那么括号括在表达式上
或者括在类型说明符上都可以
这样的形式是
是从C语言继承而来的
那么在C++中
建议使用C++的类型转换
那么C++类型转换方式呢
是要有类型转换操作符
后面尖括号里面给出类型说明符
然后括号里面给出表达式
那么类型转换操作符呢
可以是const cast
dynamic cast
reinterpret cast和static cast
那么我们目前初学的时候
用的比较多的呢是static cast
大家先学会用这个就可以了
它就是简单的将变量
从一个类型转换成另一个类型
显式的转换
有的时候也叫强制类型转换
其他的类型转换操作呢
在以后的内容和例题中
遇到了我会追一给大家介绍
那现在我们来看底下的例子
比如说这里要将这个z
变量的类型转换成int类型
这样三种写法是完全等价的