1 隐式转换的常见场景
- 赋值转换:当赋值运算符左右两边类型不同时,编译器会将右值转换为左值的类型
代码语言:javascript
AI代码解释
char c = 'A'; // 'A'的ASCII码是65 int i = c; // 隐式转换:char -> int,i的值为65 float f = i; // 隐式转换:int -> float,f的值为65.0f double d = f; // 隐式转换:float -> double- 算术运算转换:在算术运算中,不同类型的操作数会被转换为共同的类型(通常是精度更高的类型)
代码语言:javascript
AI代码解释
int a = 10; double b = 3.14; double result = a + b; // a被隐式转换为double,再与b相加- 函数调用转换:实参类型会被转换为形参类型
代码语言:javascript
AI代码解释
void printDouble(double d) { std::cout << d << std::endl; } int main() { int x = 42; printDouble(x); // x被隐式转换为double return 0; }- 返回值转换:函数返回值会被转换为函数声明的返回类型
代码语言:javascript
AI代码解释
double calculate() { return 42; // 42(int)被隐式转换为42.0(double) }2.2 隐式转换的规则
C/C++ 定义了一套隐式转换的规则,称为 "通常的算术转换"(usual arithmetic conversions),其核心原则是:
- 低精度类型向高精度类型转换("值保留" 转换)
- 整数类型向浮点类型转换
- 小范围类型向大范围类型转换
基本数据类型的隐式转换大致遵循以下顺序(从左到右可隐式转换):
bool → char → short → int → long → long long → float → double → long double
2.3 隐式转换的风险
虽然隐式转换方便了编程,但也存在潜在风险:
- 数据截断:当高精度类型向低精度类型转换时,可能发生数据丢失
代码语言:javascript
AI代码解释
double d = 3.14159; int i = d; // 隐式转换,i的值为3,小数部分被截断- 符号问题:有符号类型与无符号类型之间的转换可能导致意外结果
代码语言:javascript
AI代码解释
int a = -1; unsigned int b = 1; if (a < b) { // 实际结果为false,因为a被转换为unsigned int后是很大的正数 std::cout << "a < b" << std::endl; } else { std::cout << "a >= b" << std::endl; // 这行会被执行 }三、显式类型转换
显式类型转换(也称为强制类型转换)是程序员通过特定语法明确请求的转换。显式转换可以实现隐式转换不允许的转换,但其安全性需要程序员自己保证。