C++ 隐式类型转换
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。
例如:
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大了。
第一段代码相当于这样
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了
这也告诉我们在写程序的时候要尽量避免多种类型的混合操作。
- MapX中实现友好的交互
- 170个城市网约车车辆准入条件大数据报告
- 测试人员的“偷懒大法”
- Flash背景透明的代码
- Maven私服Nexus3.x环境构建操作记录
- Mapx用xml创建点图层
- 编程语言之间的百舸争流
- Mysql连接错误:Lost connection to Mysql server at 'waiting for initial communication packet'
- 适应现代变化的数据架构
- Linux下修改系统编码的操作记录
- 微信公众平
- linq to xml复习
- web cache server方案比较:varnish、squid、nginx
- Nginx虚拟目录alias和root目录
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- sql注入总结笔记
- WebRTC | Web服务器原理、Nodejs工作原理、Nodejs事件处理流程、V8引擎等要点解析
- OpenGL ES 3.0 | 围绕HelloTriangle实战案例 展开 渲染流程分析
- 基于 Kotlin + Netty 实现一个简单的 TCP 自定义协议
- dnslog带出——sqli-labs第8关
- Boolean源码解剖学
- SpringBoot+Mybatis整合出现org.apache.ibatis.binding.BindingException: Invalid bound statement (not found
- xss-labs第1~13关
- 在虚拟机上搭建xss平台
- 一个速度快,内存占用小的一致性哈希算法
- 一文搞定web微信第三方登录
- python学习笔记(1)
- Swift Mutating
- 31.opengl高级光照-泛光bloom
- Swift 泛型