类型转换与强制类型转换
要把变量从一种类型转换为另外一种类型,应把目标类型放在变量前面的括号中(即强制类型转换运算符)。
1. 基本语法
(目标类型)表达式
示例:上一节代码中 QuarterSold 是 long 类型,可通过强制转换变为 float:
RevQuarter = (float)QuarterSold / 150 * Revenue_Per_150;
这样 QuarterSold 的值会被显式地转换为 float 类型参与运算。
2. 转换整个表达式
如果要把整个表达式的结果从一种类型强制转换为另外一种类型,则需要把整个表达式放在括号里面:
result = (double)(a + b) / 2 - (a + b) / (double)(a * a + b * b);
3. 隐式类型转换(自动提升)
当二元运算符的两个操作数中有一个是 double 类型时,另一个操作数也会被自动强制转换为 double 类型,然后才进行运算。
例如上面代码中:
(double)(a+b)将a+b的结果(int类型)强制转为double,此时除数2也会被自动提升为double,执行浮点数除法。(double)(a*a + b*b)同理,将整个分母强制转为double,(a+b)的结果也会被自动提升为double。
4. 代码示例
#include <stdio.h>
#include <limits.h>
#include <float.h>
#include <stddef.h>
int main(void)
{
double result = 0.0;
int a = 5;
int b = 7;
result = (double)(a+b)/2 - (a + b)/(double)(a*a + b*b);
printf("%lf",result);
return 0;
}Code language: PHP (php)
运行解析:
| 表达式部分 | 计算过程 | 结果 |
|---|---|---|
(double)(a+b) | (double)12 = 12.0 | 12.0 |
12.0 / 2 | 12.0 / 2.0 = 6.0 | 6.0 |
a*a + b*b | 25 + 49 = 74 | 74 |
(double)(74) | 强制转为 74.0 | 74.0 |
(a+b) / 74.0 | 12 / 74.0 = 0.162... | 0.162162... |
6.0 - 0.162162... | 浮点减法 | 5.837838... |
输出:5.837838(具体精度取决于 %lf 默认输出6位小数)
5. 核心要点
| 转换方式 | 语法 | 说明 |
|---|---|---|
| 强制类型转换 | (类型)变量或表达式 | 显式指定目标类型,优先级较高 |
| 隐式类型转换 | 自动发生 | 混合类型运算时,向精度更高的类型提升 |
| 整型提升 | char/short → int | 参与运算前自动提升 |
| 寻常算术转换 | 向更宽类型靠拢 | int + double → double |