C++学习笔记(3)
变量转换发生在已经提供的数据与预想的数据类型不一致时,就需要进行变量转换以保证程序的正确运行,比如在变量赋值或者初始化时:
float a = 3;
这个时候我们需要一个浮点类型的数据,但是提供的数据只是一个整形的数据,那么在此时编译器在编译时就需要将整形常量3进行类型转化成浮点型然后再进行赋值操作,变量的转化方式有两种,一种是隐式转化由编译器去完成转化也称作自动转换,一种就是显式转化有程序设计者在编写程序时使用类型转换操作符进行操作。
隐式转化:没有使用类型转换操作符的转化都惩治为隐式转化
显式转化:使用类型转化操作符的转化
变量类型转化步骤:提升和转化。
整形提升:将char ,bool,short,等整形变量提升成为int 型额变量
浮点提升:将float提升为double型变量
转化第一原则就是保证数据是安全的,不会因为提升而是原有变量发生不安全的隐患,比如将无符号的数提升为有符号的数,或者是有符号的数提升为无符号的数字。下例中的变量经过提升后就会出错
unsigned char a =255;
printf("%d",(signed char)a);//打印输出为-1,
转化时一定要保证转化的对象一定要足够的大小来容得下要转化的变量。
同一表达式内有不同的数据类型:
编译器在处理表达式时会将表达式分成相应的子式,并且要求操作符两侧具有相同的数据类型,当数据类型不同时编译器根据转化的优先级表进行转化,转化成相同优先级后表达式再进行运算,转化时以操作符两端中优先级较高的一个为目标,将优先级低的数据类型提升到目标类型。优先级顺序为
- long double (最高优先级)
- double
- float
- unsigned long long
- long long
- unsigned long
- long
- unsigned int
- int (最低优先级)
x显式转化:
利用操作符进行显式转化(data type)
在C++中有几种显式转化的方式,
方法1、c-style方式转化,这种方式的语法规则和c语言的相同,都是利用(data type)进行转化,但是这种转化具有潜在的不安全性,在转化const常量时可能将const属性丢掉,这个不安全性我没有测试出来一下是测试代码
const char* ptr= "hello ma friend";
std::cout << (unsigned char*)ptr <<std::endl;
*ptr = "hello my girl";
return 0;
在编译 时依然提示assignment to a read-only location "ptr";
那么也就是说明ptr依然是一个指针常量,是不能进行赋值的,那么这个const属性就没有丢掉,
此外关于c-style还有一个缺点就是 changing a data type without changing the underlying representation (leading to garbage results).那么不改变底层数据类型,这个应该不是一个缺点啊,变量转换不是说以后的变量都是这个数据类型,只是这词我需要这样的变量,不代表以后我都是这种类型,所以这个说话不成立
2、静态转换static-cast<data style>
话说这个比较安全,比c类型转换要安全一点