网站首页 > 技术文章 正文
上一篇文章,学习了C语言的6种基本数据类型。这篇文章就来聊一聊,基本数据类型之间的转换。
什么是类型转换?就是将数据(变量、数值、表达式结果等)从一种类型转换到另一种类型。但这种改变并不是发生在原本数据上,一般都是创建一个新的类型变量来承载转换类型的数据。
为什么在程序中需要进行类型改变呢?来举一个小小的栗子:
在现实生活中,我们现在有一群人的成绩(数值为整数),我们需要计算他们的平均数。实际情况中,整数相除有可能是整数,也有可能是小数。
但是在C语言当中,两个整数相除,结果依然是整数。但如果实际结果是有小数部分的,那这样的数据就失真了,因此就需要用到了类型转换。
来看一段计算代码:
#include<stdio.h>
int main(){
int a = 5;
int b = 2;
double c = a / b;
printf("%f", c);
return 0;
}
运行出来的结果是:2.000000.
但实际上,这个运行结果并不是我们想要的。我们都知道 5 除以 2 是等于 2.5,为什么这里却变成了2.000000呢?
这就是前面提到的,在C语言程序当中,两个整数相除,结果还是整数。5 除以 2 虽然是等于 2.5,但是由于结果只能是整数,所以丢弃了小数部分。
但是为什么,还会有小数点呢?这里就涉及到了类型转换的知识了。
类型转换,一共有两种形式,一种是自动转换,也叫作隐式转换;另一种是强制转换,也叫作显式转换。
自动转换
是编译根据代码上下文环境自行判断的结果。
这种转换方式,是系统自己默默地执行,是暗地里的,所以也叫作隐式。就像老板让你去订一家饭馆,但没有告诉你细节问题。那能怎么办?就只能根据以往的经验去订鲁菜馆。但这种凭经验、凭理解,就会存在一个问题,谁知道老板今天请的客人会不会吃得惯这家饭馆的菜呢?
所以说,自动转换是一种不安全的转换方式,可能会存在数据失真、精度缺失等问题。
就像我们上面的那一段计算代码,就发生了数据失真的问题了。
那像这种情况应该要怎么解决呢?这就要提另一种转换方式,强制转换。
强制转换
是程序员明确提出要进行的类型转换,用特定的代码格式去指定某一种类型的转换。
同样是老板让你去订饭店,但会跟你说今天请的这个客人他是四川人,从小在湖南长大,无辣不欢,去定一家川菜馆或者湘菜馆。这样子目标就很明确了,就不会盲目地定一家鲁菜馆了。
强制转换是有特定的代码格式来进行转换的:
typename variable = (typename) expression
typename 即数据的类型;variable 即变量;expression 可以是具体的值、某个变量、某个表达式等等。
在前面的那段计算代码中加上对某个 int 类型进行强制转换之后,再来看看结果是什么样的:
#include<stdio.h>
int main(){
int a = 5;
int b = 2;
double c = (double)a/b;
printf("%f", c);
return 0;
}
运行结果:2.500000。
OK,符合预期的结果了!
看到这里,肯定有人又有疑惑了,为什么不直接把 a/b 括号起来然后进行转换?为什么只转换其中一个,结果就正确了呢?
首先第一个问题,这是因为如果括号起来,那么首先计算的是 a/b,仍旧是两个整数相除,结果还是 2,然后经过 double 转换,运行的结果就和上面的一样,都是2.000000。
第二个问题,为什么只转换其中一个。这是因为在C语言中,不同类型的数据在进行操作的时候,首先会根据转换规则将这两种不同类型转换为同一种类型。而转换的规则,是由低级向高级转换,具体如下图所示:
注:unsigned 即 unsigned int。
当然,你不嫌麻烦,也可以一个个进行强制转后再进行运算。
那么强制转换就一定安全吗?
如果你老板不知道邀请的这位客人,因为吃辣的吃腻了,突然想要换个口味,吃个鲁菜。那你都执行下去了,结果很有可能就是项目黄了。
所以,强制转换也不是绝对安全的。程序员在进行强制转换的时候,一定要时刻保持警惕,要问自己进行转换后数据会不会发生丢失,是否可能存在非方访问,如果可以回答这两个问题,并且能控制所有可能会发生的情况,就可以大胆尝试去进行强制转换。
类型转换是临时的
无论是自动转换,还是强制转换,目的都是为了本次运算而进行的一次临时变换。转换的结果是临时保存在内存中的,而并不会改变原本的值。
来看一个例子:
#include<stdio.h>
int main(){
double a = 10.55;
int a_i = (int)a;
printf("a=%lf, a_i=%d", a, a_i);
return 0;
}
运行结果:a=10.550000,a_i=10
代码中,double 类型的 a 变量通过强制转换的方式将其转换为 int 类型,并将值赋给了 a_i 变量,这种转换并没有影响到 a 变量本身的值或者类型。
如果 a 变量的值发生了改变,那么输出的结果应该是 10.000000。
最后
关于基本数据类型之间的转换内容就讲到了这里。文章中可能会存在一些缺漏的知识点,大家如果有什么想法或者疑惑可以在评论区留言,一起交流学习。最后,感谢大家的观看!
猜你喜欢
- 2024-09-12 c++ printf 到 std::cout(c++怎么用printf输出整数)
- 2024-09-12 C 语言未初始化的局部变量是多少?
- 2024-09-12 大话C语言:函数(c语言函数视频讲解)
- 2024-09-12 每日一题||C语言刷题(c语言刷题网)
- 2024-09-12 大话C语言:逗号运算符及运算法优先级
- 2024-09-12 C语言学习篇(14)-----sizeof运算符
- 2024-09-12 C语言 include的用法(c语言include的用法与搭配)
- 2024-09-12 C语言的位运算基本操作演示(c语言位运算的运算规则)
- 2024-09-12 编写一个C程序,输入a,b,c三个值,输出其中最大值
- 2024-09-12 C语言如何实现大数相加(c语言大数相加思路)
- 08-06中等生如何学好初二数学函数篇
- 08-06C#构造函数
- 08-06初中数学:一次函数学习要点和方法
- 08-06仓颉编程语言基础-数据类型—结构类型
- 08-06C++实现委托机制
- 08-06初中VS高中三角函数:从"固定镜头"到"360°全景",数学视野升级
- 08-06一文讲透PLC中Static和Temp变量的区别
- 08-06类三剑客:一招修改所有对象!类方法与静态方法的核心区别!
- 1522℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 650℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 527℃MySQL service启动脚本浅析(r12笔记第59天)
- 492℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 492℃启用MySQL查询缓存(mysql8.0查询缓存)
- 479℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 461℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 460℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- windowsscripthost (69)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (70)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)