笔面试题相关知识点整理(一)--隐式类型转换

来源:互联网 发布:ec软件使用 编辑:程序博客网 时间:2024/06/05 00:12

c++定义了一组内置类型对象之间的标准转换,在必要时它们被编译器隐式地应用到对象上。

隐式类型转换发生在下列这些典型情况下:(并不是所有类型都可以隐式转换,本篇只讨论基本数据类型中的部分情况)

1、混合类型的算术表达式中

此时会将最宽的数据类型作为目标转换类型,也称为算术转换。

如:int i = 3;

double j = 1.2;

i + j; //i将被提升为double类型

2、赋值转换

当赋值运算符两侧的数据类型不同时,会将右侧变量的数据转换为左侧变量的数据类型。

如:int *p = 0;  //将0转换为int *类型的空指针值,但一般不这么用,一般用NULL表示

int i = 3;

double j = 1.2;

 i = j; //j被截断为int类型的值1

3、函数传参

当调用表达式的类型与形式参数的类型不相同时,一般会将形参类型作为目标转换类型。

extern double sqrt(double n);    

cout<<sqrt(2)<<endl;//2被提升为double类型

4、函数返回值

当函数返回的表达式的类型与返回值类型不同时,一般会将表达式自动转换成函数类型。

double dif(int i,int j)

{

return i - j;//返回值会被提升为double类型

}


算术转换的两个通用的指导原则如下:

1)为防止精度损失,如果必要的话,类型总是被提升为较宽的类型。

2)所有包含小于整型的有序类型的算术表达式在计算之前其类型都会被转换为整型。


具体说明:

1、如果一个操作数的类型是long double,那么另一个无论是什么类型都会被转换成long double。

2、如果两个都不是long double型,那么若其中一个操作数是double型,则另一个将被转换为double型。

3、同样地,若都不是double型,其中一个为float型,则另一个将被转换为float型。

4、倘若两个操作数都不是浮点型,那么一定是某种整型类型。在确定共同的目标提升类型之前,编译器将在所有小于int的整值类型上施加一个被称为整值提升的过程。

1)在进行整值提升时类型char、signed char、unsigned char和short int都被提升为类型int。

2)如果机器上的类型空间足够表示所有unsigned short型的值,这通常发生在short用半个字而int用一个字表示的情况下,则unsigned short int也被转换成int,否则它会提升为unsigned int。

3)wchar_t(c/c++的字符类型,是一种扩展存储方式)和枚举类型被提升为能够表示其底层类型(数据在实际存储时所使用的类型)所有值的最小整数类型。例如:enum status{ bad,ok};当这些值实际上作为char类型存储时,char代表了枚举的底层类型,然后status的整值提升将它的底层类型转换为int。

4)long类型的一般转换有一个例外,如果一个操作数是long型而另一个是unsigned int型,那么只有机器上的long型的长度足以存放unsigned int的所有值时(一般来说,在32位操作系统中long型和int型都用一个字长表示,所以无法存放unsigned int的所有值),unsigned int才会被转换为long型,否则两个都被提升为unsigned long型。

若两个操作数都不是long型,而其中一个为unsigned int型,则另一个也被转换为unsigned int型,否则两个操作数一定都是int型。

原创粉丝点击