赋值语句中的隐式类型转换
赋值运算符 = 右边的表达式与左边的变量类型不同时,也会发生隐式类型转换。编译器会自动将右边的值转换为左边变量的类型。
1. 赋值转换的数据丢失风险
当浮点数赋值给整数类型时,小数部分会被直接截断,只保留整数部分:
int number = 0;
float value = 2.5f;
number = value; // number 中存储的是 2,小数部分 .5 丢失Code language: JavaScript (javascript)
#include <stdio.h>
int main(void)
{
int number = 0;
float value = 2.5f;
number = value;
printf("\n%d\n",number); // 输出 2
return 0;
}Code language: PHP (php)
注意:这种赋值转换会丢失信息,编译器通常会发出警告(如 warning: implicit conversion loses floating-point precision),但仍能编译通过。程序可能得到不正确的结果。
2. 推荐做法:显式类型转换
为避免隐式转换带来的精度丢失和编译器警告,建议主动使用强制类型转换明确意图。
3. 复杂表达式中的类型转换追踪
以下代码声明了4个变量,计算订单总价,涉及多层隐式转换:
#include <stdio.h>
int main(void)
{
double price = 10.0;
long count = 5L;
float ship_cost = 2.5F;
int discount = 15;
long double total_cost = (count*price + ship_cost)*((100L - discount)/100.0F);
printf("%Le",total_cost);
return 0;
}Code language: PHP (php)
逐步类型转换解析:
| 步骤 | 表达式 | 类型转换过程 | 结果类型 |
|---|---|---|---|
| 1 | count * price | count(long) 提升为 double,与 price(double) 相乘 | double |
| 2 | 上一步结果 + ship_cost | ship_cost(float) 提升为 double | double |
| 3 | 100L - discount | discount(int) 提升为 long,与 100L(long) 相减 | long |
| 4 | 上一步结果 / 100.0F | long 提升为 float,与 100.0F(float) 相除 | float |
| 5 | 步骤2结果 / 步骤4结果 | 步骤4的 float 提升为 double,与步骤2的 double 相除 | double |
| 6 | 赋值给 total_cost | double 提升为 long double(无精度丢失,无警告) | long double |
最终输出:52.500000(即 5.25e+01,%Le 以指数形式输出 long double)