- C编程教程
- C - 首页
- C语言基础
- C - 概述
- C - 特性
- C - 历史
- C - 环境搭建
- C - 程序结构
- C - Hello World
- C - 编译过程
- C - 注释
- C - 词法单元
- C - 关键字
- C - 标识符
- C - 用户输入
- C - 基本语法
- C - 数据类型
- C - 变量
- C - 整数提升
- C - 类型转换
- C - 类型强制转换
- C - 布尔值
- C语言中的常量和字面量
- C - 常量
- C - 字面量
- C - 转义序列
- C - 格式说明符
- C语言中的运算符
- C - 运算符
- C - 算术运算符
- C - 关系运算符
- C - 逻辑运算符
- C - 位运算符
- C - 赋值运算符
- C - 一元运算符
- C - 自增和自减运算符
- C - 三元运算符
- C - sizeof 运算符
- C - 运算符优先级
- C - 其他运算符
- C语言中的决策语句
- C - 决策语句
- C - if 语句
- C - if...else 语句
- C - 嵌套 if 语句
- C - switch 语句
- C - 嵌套 switch 语句
- C语言中的循环
- C - 循环
- C - while 循环
- C - for 循环
- C - do...while 循环
- C - 嵌套循环
- C - 无限循环
- C - break 语句
- C - continue 语句
- C - goto 语句
- C语言中的函数
- C - 函数
- C - 主函数
- C - 按值传递函数调用
- C - 按引用传递函数调用
- C - 嵌套函数
- C - 可变参数函数
- C - 用户自定义函数
- C - 回调函数
- C - 返回语句
- C - 递归
- C语言中的作用域规则
- C - 作用域规则
- C - 静态变量
- C - 全局变量
- C语言中的数组
- C - 数组
- C - 数组的特性
- C - 多维数组
- C - 将数组传递给函数
- C - 从函数返回数组
- C - 变长数组
- C语言中的指针
- C - 指针
- C - 指针和数组
- C - 指针的应用
- C - 指针运算
- C - 指针数组
- C - 指向指针的指针
- C - 将指针传递给函数
- C - 从函数返回指针
- C - 函数指针
- C - 指向数组的指针
- C - 指向结构体的指针
- C - 指针链
- C - 指针与数组
- C - 字符指针和函数
- C - 空指针
- C - void 指针
- C - 悬空指针
- C - 解引用指针
- C - 近、远和巨型指针
- C - 指针数组的初始化
- C - 指针与多维数组
- C语言中的字符串
- C - 字符串
- C - 字符串数组
- C - 特殊字符
- C语言中的结构体和联合体
- C - 结构体
- C - 结构体和函数
- C - 结构体数组
- C - 自引用结构体
- C - 查找表
- C - 点(.)运算符
- C - 枚举(或枚举类型)
- C - 结构体填充和打包
- C - 嵌套结构体
- C - 匿名结构体和联合体
- C - 联合体
- C - 位域
- C - typedef
- C语言中的文件处理
- C - 输入和输出
- C - 文件 I/O(文件处理)
- C 预处理器
- C - 预处理器
- C - 编译指示
- C - 预处理器运算符
- C - 宏
- C - 头文件
- C语言中的内存管理
- C - 内存管理
- C - 内存地址
- C - 存储类别
- 其他主题
- C - 错误处理
- C - 可变参数
- C - 命令执行
- C - 数学函数
- C - static 关键字
- C - 随机数生成
- C - 命令行参数
- C编程资源
- C - 问答
- C - 快速指南
- C - 速查表
- C - 有用资源
- C - 讨论
C语言中的类型转换
术语“类型转换”是指将一种数据类型转换为另一种数据类型。它也称为“类型转换”。在某些情况下,编译器会自行执行转换(隐式类型转换),以便数据类型彼此兼容。
在其他情况下,C编译器会强制执行类型转换(显式类型转换),这是由类型转换运算符引起的。例如,如果要将“long”值存储到简单整数中,则可以将“long”类型转换为“int”类型。
可以使用类型转换运算符显式地将值从一种类型转换为另一种类型 -
(type_name) expression
示例 1
考虑以下示例 -
#include <stdio.h> int main() { int sum = 17, count = 5; double mean; mean = sum / count; printf("Value of mean: %f\n", mean); }
输出
运行代码并检查其输出 -
Value of mean: 3.000000
虽然我们期望结果为 17/5,即 3.4,但它显示为 3.000000,因为除法表达式中的两个操作数都是 int 类型。
示例 2
在 C 语言中,除法运算的结果始终为字节长度较大的数据类型。因此,必须将其中一个整数操作数强制转换为 float 类型。
强制转换运算符导致将一个整数变量除以另一个整数变量作为浮点运算执行 -
#include <stdio.h> int main() { int sum = 17, count = 5; double mean; mean = (double) sum / count; printf("Value of mean: %f\n", mean); }
输出
编译并执行上述代码时,会产生以下结果 -
Value of mean: 3.400000
这里需要注意的是,强制转换运算符优先于除法,因此 sum 的值首先转换为 double 类型,最后除以 count,得到一个 double 值。
类型转换可以是编译器自动执行的隐式转换,也可以通过使用强制转换运算符显式指定。在需要类型转换时使用强制转换运算符被认为是良好的编程实践。
类型提升规则
在执行隐式或自动类型转换时,C 编译器遵循类型提升规则。通常,遵循的原则是 -
- 字节和短整型 值 - 它们被提升为 int 类型。
- 如果一个操作数为 long 类型 - 整个表达式被提升为 long 类型。
- 如果一个操作数为 float 类型 - 整个表达式被提升为 float 类型。
- 如果任何一个操作数为 double 类型 - 结果被提升为 double 类型。
C语言中的整数提升
整数提升是将小于 int 或 unsigned int 的整数类型的值转换为 int 或 unsigned int 的过程。
示例
考虑一个将字符与整数相加的示例 -
#include <stdio.h> int main() { int i = 17; char c = 'c'; /* ascii value is 99 */ int sum; sum = i + c; printf("Value of sum : %d\n", sum); }
输出
编译并执行上述代码时,会产生以下结果 -
Value of sum: 116
这里,sum 的值为 116,因为编译器正在执行整数提升并将 'c' 的值转换为 ASCII 码,然后执行实际的加法运算。
通常的算术转换
通常的算术转换不适用于赋值运算符,也不适用于逻辑运算符 && 和 ||。
示例
让我们以以下示例来理解这个概念 -
#include <stdio.h> int main() { int i = 17; char c = 'c'; /* ascii value is 99 */ float sum; sum = i + c; printf("Value of sum : %f\n", sum); }
输出
编译并执行上述代码时,会产生以下结果 -
Value of sum: 116.000000
这里,很容易理解首先 c 被转换为整数,但是由于最终值为 double 类型,因此应用了通常的算术转换,编译器将 i 和 c 转换为 'float' 类型并相加,得到一个 'float' 类型的结果。