CSDN话题挑战赛第2期
参赛话题:学习笔记
上一篇文章,学习了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。
最后
关于基本数据类型之间的转换内容就讲到了这里。文章中可能会存在一些缺漏的知识点,大家如果有什么想法或者疑惑可以在评论区留言,一起交流学习。最后,感谢大家的观看!