571免费建网站,wordpress写网站,成都房产网最新楼盘二手房信息,网站项目框架在C编写C/C代码的时候#xff0c;我们经常会遇到发生类型转换的场景#xff0c;比如 赋值运算符的两个操作数不同、实参和形参类型不同、函数返回值类型和接收返回值的类型不同#xff0c;都会发生类型转换#xff1b;所以#xff0c;在C语言中提供了两种类型转换 —— 隐… 在C编写C/C代码的时候我们经常会遇到发生类型转换的场景比如 赋值运算符的两个操作数不同、实参和形参类型不同、函数返回值类型和接收返回值的类型不同都会发生类型转换所以在C语言中提供了两种类型转换 —— 隐式类型转换和显示类型转换
隐式类型转换 隐式类型转换是隐藏的是我们看不见的比如下面这段代码
double a 1.0;
int b a; // 发生隐式类型转换
隐式的类型转换有以下几种 1.整形和整形之间不同的整形之间是可以发生隐式类型转换的比如charshortintlong 、long long之间char是属于整形家族的哦。 2.整形和浮点型之间整形和浮点型数据之间也具有一定的关联性也是可以发生隐式类型转换的比如int 和 doubleint 和 float 类型的数据…… 3.整形和bool之间因为在编程中我们习惯用0表示假非0表示真所以整形和bool型的数据是可以相互转换的。 4.指针和bool之间指针有可以分为空指针和非空指针相当于0和非0所以指针类型的数据也是可以和bool型之间的数据进行转换的。
显示类型转换 显示类型转换式可以看见的是用户显示使用的比如下面这段代码
int main(){int c 0;char* pc (char*)c;return 0;
}
显示的类型转换有以下几种 整形和指针类型之间这两者之间可以转换是因为指针是进程地址空间中字节的编号和整形数据之间还是具有关联性的所以可以互相转换。 不同类型的指针变量之间之所以可以互相转换和上面一点是相同道理的但是指针的类型决定了指针解引用之后可以访问的内存地址字节数的大小比如说int*类型的指针解引用之后可以访问四字节的内存空间char*类型的指针解引用之后只能访问1字节的内存空间这是由指针所指向的数据的类型决定的。有了这个点其实所有类型的对象之间都能间接转换了但是解引用之后所能访问的内存空间大小不一样。
C中的强制类型转换 在C语言中新增了四个用于强制类型转换的关键字分别是 static_cast、 dynamic_cast, const_cast、 和 reinterpret_cast使用语法为 xxxx_cast(expression)。 相比于C语言中使用小括号()来完成强制类型转换C中这几个关键字的引入能更清晰的表明它要完成强制类型转换的意图容易暴露出隐藏的问题。 其实很长一段时间以来我对于这四种强转方式区分的不是很清晰其中 const_cast 的功能还比较容易辨别但是另外3种经常混作一团所以在仔细学习后才发现这4种强转关键字的区别就在他们的名字上下面逐个来看一下。
static_cast 这个关键字的作用主要表现在 static 上是一种静态的转换在编译期就能确定的转换可以完成C语言中的强制类型转换中的大部分工作但需要注意的是它不能转换掉表达式的 const、volitale 或者 _unaligned 属性。
dynamic_cast 从名字上看这个关键字与 static_cast 的静态转换是对立的这是一个“动态”转换函数只能对指针和引用的进行转换并且只用于类继承结构中基类和派生类之间指针或引用的转换可以进行向上、向下或者横向的转换。 相比于 static_cast 的编译时转换 dynamic_cast 的转换还会在运行时进行类型检查转换的条件也比较苛刻必须有继承关系的类之间才能转换并且在基类中有虚函数才可以有一种特殊的情况就是可以把类指针转换成 void* 类型
const_cast 在C/C中const限定符通常被用来限定变量用于表示该变量的值不能被修改这种限定可以避免程序员犯一些初级错误但同时也造成了一些不便比如一些已有函数要求非常量指针但是掉用这些函数的接口函数中都传递了常量指针这时候就要对指针类型去常量化。 但需要特别注意的是 const_cast 不能去除变量的常量性只能用来去除指向常数对象的指针或引用的常量性且去除常量性的对象必须为指针或引用。 常量指针被转化成非常量指针并且仍然指向原来的对象常量引用被转换成非常量引用并且仍然指向原来的对象常量对象可能被转换成非常量对象。 实际上使用const_cast通常是一种无奈之举利用const_cast去掉指针或引用的常量性并且去修改原始变量的数值这是一种非常不好的行为如果可以的话尽可能在程序设计阶段就规避这种情况。
reinterpret_cast 它被用于不同类型指针或引用之间的转换或者指针和整数之间的转换是对比特位的简单拷贝并重新解释因此在使用过程中需要特别谨慎比如前面提到的一个例子static_cast 不能将 int* 直接强转成 char*使用reinterpret_cast就可以办到。