前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ 隐式类型转换

C++ 隐式类型转换

作者头像
用户1215536
发布2018-02-05 14:34:31
1.2K0
发布2018-02-05 14:34:31
举报

C++定义了一组内置类型对象之间的转换标准,在必要的时候它们被编译器隐式的转换

1、任何两种或多种类型的数据和变量混合操作的时候,最宽的数据类型成为目标转换类型(常量和变量都会被改变)

2、不同类型的表达式之间赋值的时候,被赋值的对象类型成为目标转换类型

3、函数调用实参和形参类型不一致的时候,形参的对象类型成为目标转换类型

4、函数的返回值类型和函数表达式的类型不一样的时候,函数表达式的类型成为目标转换类型

注意:算术运算中两个通用的的指导准则如下

(1)为了防止精度损失,类型总是被提升为较宽的类型。

(2)所有含有小于整型的有序类型的算术表达式在计算之前其类型都会被转换成整型(即整数提升),计算完之后再转换为被定义的类型。

按照从高到低的顺序给各种数据类型分等级,依次为:long double, double, float, unsigned long long, long long, unsigned long, long, unsigned int 和 int。这里有一个小小的例外,如果 long 和 int 大小相同,则 unsigned int 的等级应位于 long 之上。char 和 short 并没有出现于这个等级列表,是因为它们应该已经被升级成了 int 或者 unsigned int。

 例如:

代码语言:javascript
复制
 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int a[]={1,2,2,3,4};
 6     int n=sizeof(a);
 7     if(-1>(n/sizeof(int)))
 8         cout<<"1";
 9     else
10         cout<<"2";
11     return 0;
12 }

上述代码的输出结果竟然是1,原因在于sizeof()的返回类型是unsigned int,而-1是int,所以-1被隐式的转换成了unsigned int类型,而变成了

oxffffffff,当然就比5大了。

第一段代码相当于这样

代码语言:javascript
复制
 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int a[]={1,2,2,3,4};
 6     int n=sizeof(a);
 7     unsinged int b=n/sizeof(int);
 8     if(-1>b)
 9     //if(-1>(n/sizeof(int)))
10         cout<<"1";
11     else
12         cout<<"2";
13     return 0;
14 }

如果把这段代码中第7行改为 int b=n/sizeof(int)的话,就会输出2了

这也告诉我们在写程序的时候要尽量避免多种类型的混合操作。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-03-30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档