C 语言:类型转换与常量的细致理解

C 语言中的类型转换

有时,您必须将一种数据类型的值转换为另一种类型。这称为类型转换

隐式转换

当您将一种类型的值分配给另一种类型的变量时,编译器会自动进行隐式转换。

例如,如果您将一个 int 值分配给一个 float 类型:

c 复制代码
// 自动转换:int to float
float myFloat = 9;

printf("%f", myFloat); // 输出 9.000000

如您所见,编译器会自动将 int 值 9 转换为 float 值 9.000000。

这可能是危险的,因为您可能会在某些情况下失去对特定值的控制。

尤其是如果相反的情况 - 以下示例会自动将 float 值 9.99 转换为 int 值 9:

c 复制代码
// 自动转换:float to int
int myInt = 9.99;

printf("%d", myInt); // 输出 9

0.99 发生了什么?我们可能想要在我们的程序中使用这个数据!所以要小心。您必须了解编译器在这些情况下的工作方式,以避免意外结果。

另一个例子,如果您将两个整数 5 除以 2,您知道结果是 2.5。正如您在此页面的开头所知,如果您将 sum 存储为整数,结果将只显示数字 2。因此,将 sum 存储为 floatdouble 会更好,对吗?

c 复制代码
float sum = 5 / 2;

printf("%f", sum); // 输出 2.000000

为什么结果是 2.00000 而不是 2.5?好吧,因为 5 和 2 在除法中仍然是整数。在这种情况下,您需要将整数值手动转换为浮点值(参见下文)。

显式转换

显式转换是通过在值之前放置类型括号 () 来手动完成的。

考虑到我们上面示例中的问题,我们现在可以得到正确的结果:

c 复制代码
// 手动转换: int to float
float sum = (float) 5 / 2;

printf("%f", sum); // 输出 2.500000

您也可以将类型放在变量前面:

c 复制代码
int num1 = 5;
int num2 = 2;
float sum = (float) num1 / num2;

printf("%f", sum); // 输出 2.500000

由于您在上一章中学习了"小数精度",您可以通过删除多余的零(如果您愿意)使输出更清晰:

c 复制代码
int num1 = 5;
int num2 = 2;
float sum = (float) num1 / num2;

printf("%.1f", sum); // 输出 2.5

C 语言中的常量

如果您不想让其他人(或自己)更改现有变量的值,可以使用 const 关键字。

这将声明变量为"常量",这意味着它不可更改,只读:

c 复制代码
const int myNum = 15; // myNum 始终为 15
myNum = 10; // 错误:对只读变量 'myNum' 进行赋值

当您拥有不太可能改变的值时,应始终将变量声明为常量:

c 复制代码
const int minutesPerHour = 60;
const float PI = 3.14;

关于常量的注意事项

当您声明一个常量变量时,必须为其分配一个值:

c 复制代码
// 就像这样:
const int minutesPerHour = 60;
// 然而,这不起作用:
const int minutesPerHour;
minutesPerHour = 60; // 错误

常量在程序中可以提高代码的可读性,并防止在程序中无意中更改重要的值。

最后

为了方便其他设备和平台的小伙伴观看往期文章:

微信公众号搜索:Let us Coding,关注后即可获取最新文章推送

看完如果觉得有帮助,欢迎 点赞、收藏、关注

相关推荐
Victor35612 小时前
https://editor.csdn.net/md/?articleId=139321571&spm=1011.2415.3001.9698
后端
Victor35612 小时前
Hibernate(89)如何在压力测试中使用Hibernate?
后端
灰子学技术14 小时前
go response.Body.close()导致连接异常处理
开发语言·后端·golang
Gogo81615 小时前
BigInt 与 Number 的爱恨情仇,为何大佬都劝你“能用 Number 就别用 BigInt”?
后端
fuquxiaoguang15 小时前
深入浅出:使用MDC构建SpringBoot全链路请求追踪系统
java·spring boot·后端·调用链分析
毕设源码_廖学姐15 小时前
计算机毕业设计springboot招聘系统网站 基于SpringBoot的在线人才对接平台 SpringBoot驱动的智能求职与招聘服务网
spring boot·后端·课程设计
rainbow688916 小时前
EffectiveC++入门:四大习惯提升代码质量
c++
秋邱16 小时前
用 Python 写出 C++ 的性能?用CANN中PyPTO 算子开发硬核上手指南
开发语言·c++·python
我在人间贩卖青春17 小时前
C++之析构函数
c++·析构函数
野犬寒鸦17 小时前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法