C 语言:类型转换与常量的细致理解
C 语言中的类型转换
有时,您必须将一种数据类型的值转换为另一种类型。这称为类型转换
隐式转换
当您将一种类型的值分配给另一种类型的变量时,编译器会自动进行隐式转换。
例如,如果您将一个 int 值分配给一个 float 类型:
// 自动转换:int to float
float myFloat = 9;
printf("%f", myFloat); // 输出 9.000000
如您所见,编译器会自动将 int 值 9 转换为 float 值 9.000000。
这可能是危险的,因为您可能会在某些情况下失去对特定值的控制。
尤其是如果相反的情况 - 以下示例会自动将 float 值 9.99 转换为 int 值 9:
// 自动转换:float to int
int myInt = 9.99;
printf("%d", myInt); // 输出 9
0.99 发生了什么?我们可能想要在我们的程序中使用这个数据!所以要小心。您必须了解编译器在这些情况下的工作方式,以避免意外结果。
另一个例子,如果您将两个整数 5 除以 2,您知道结果是 2.5。正如您在此页面的开头所知,如果您将 sum 存储为整数,结果将只显示数字 2。因此,将 sum 存储为 float 或 double 会更好,对吗?
float sum = 5 / 2;
printf("%f", sum); // 输出 2.000000
为什么结果是 2.00000 而不是 2.5?好吧,因为 5 和 2 在除法中仍然是整数。在这种情况下,您需要将整数值手动转换为浮点值(参见下文)。
显式转换
显式转换是通过在值之前放置类型括号 () 来手动完成的。
考虑到我们上面示例中的问题,我们现在可以得到正确的结果:
// 手动转换: int to float
float sum = (float) 5 / 2;
printf("%f", sum); // 输出 2.500000
您也可以将类型放在变量前面:
int num1 = 5;
int num2 = 2;
float sum = (float) num1 / num2;
printf("%f", sum); // 输出 2.500000
由于您在上一章中学习了“小数精度”,您可以通过删除多余的零(如果您愿意)使输出更清晰:
int num1 = 5;
int num2 = 2;
float sum = (float) num1 / num2;
printf("%.1f", sum); // 输出 2.5
C 语言中的常量
如果您不想让其他人(或自己)更改现有变量的值,可以使用 const 关键字。
这将声明变量为“常量”,这意味着它不可更改,只读:
const int myNum = 15; // myNum 始终为 15
myNum = 10; // 错误:对只读变量 'myNum' 进行赋值
当您拥有不太可能改变的值时,应始终将变量声明为常量:
const int minutesPerHour = 60;
const float PI = 3.14;
关于常量的注意事项
当您声明一个常量变量时,必须为其分配一个值:
// 就像这样:
const int minutesPerHour = 60;
// 然而,这不起作用:
const int minutesPerHour;
minutesPerHour = 60; // 错误
常量在程序中可以提高代码的可读性,并防止在程序中无意中更改重要的值。
最后
为了方便其他设备和平台的小伙伴观看往期文章:
微信公众号搜索:Let us Coding,关注后即可获取最新文章推送
看完如果觉得有帮助,欢迎 点赞、收藏、关注
C 语言:类型转换与常量的细致理解的更多相关文章
- Java常量池的理解
1.常量池的好处常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享.例如字符串常量池,在编译阶段就把所有的字符串文字放到一个常量池中.(1)节省内存空间:常量池中所有相同的字符串常 ...
- Java常量字符串String理解
Java常量字符串String理解 以前关于String的理解仅限于三点:1.String 是final类,不可继承2.String 类比较字符串相等时时不能用“ == ”,只能用 "eq ...
- Swift语言指南(一)--语言基础之常量和变量
原文:Swift语言指南(一)--语言基础之常量和变量 Swift 是开发 iOS 及 OS X 应用的一门新编程语言,然而,它的开发体验与 C 或 Objective-C 有很多相似之处. Swif ...
- Go 语言类型转换
类型转换用于将一种数据类型的变量转换为另外一种类型的变量.Go 语言类型转换基本格式如下: type_name(expression) type_name 为类型,expression 为表达式. 实 ...
- 智能合约语言 Solidity 教程系列10 - 完全理解函数修改器
这是Solidity教程系列文章第10篇,带大家完全理解Solidity的函数修改器. Solidity系列完整的文章列表请查看分类-Solidity. 写在前面 Solidity 是以太坊智能合约编 ...
- Go语言类型转换
类型转换用于将一种数据类型的变量转换为另外一种类型的变量. Go语言类型转换基本格式如下:表达式 T(v) 将值 v 转换为类型 T . Go语言各种类型转换及函数的高级用法:strconv包实现了基 ...
- GO语言学习(十七)Go 语言类型转换
Go 语言类型转换 类型转换用于将一种数据类型的变量转换为另外一种类型的变量.Go 语言类型转换基本格式如下: type_name(expression) type_name 为类型,expressi ...
- Delphi VS C语言类型转换对照
Delphi VS C语言类型转换对照 When converting C function prototypes to Pascal equivalent declarations, it's ...
- C语言类型转换原理
C语言类型转换 int a; a=1.23 这里把1.23赋值给a发生了隐式转换,原理如下: int a; float b=3.14; a=b; b赋值给a的过程:首先找一个中间变量是a的类型(该例中 ...
- c语言类型转换注意事项
转载自: http://blog.csdn.net/zhuimengzh/article/details/6728492 1.隐式转换 C在以下四种情况下会进行隐式转换: 1.算 ...
随机推荐
- 【开发工具】Linux 服务器 Shell 脚本简单应用(MySql备份等脚本)
上一章介绍完基础[开发工具]Linux 服务器 Shell 脚本简单入门,这一章结合实际运用 对于 do while if else等流程控制基础不再说明,和编程语言大同小异,可以在实际的脚本使用中学 ...
- 【Azure 存储服务】多设备并发往 Azure Storage Blob 的 Container 存数据是否可以
问题描述 多设备并发往 Azure Storage Blob 的 Container 存数据是否可以? 问题解答 可以! Azure Storage 是支持的并发存储数据的,Blob 可以使用乐观并发 ...
- book 电子书转换 在线工具
https://convertio.co/download/911d3a3f39db0b2e39ed6e3c8acb31f6be786a/ Convertio
- Codeforces Round 113 (Div. 2)E. Tetrahedron(dp、递推)
目录 题面 链接 题意 题解 代码 总结 题面 链接 E. Tetrahedron 题意 从一个顶点出发走过路径长度为n回到出发点的方案总数 题解 考虑dp \(f[i][0|1|2|3]\):走了i ...
- linux 服务器 执行命令挂起 nohup 改用 pm2
nohup http-server -p 80 & nohup完要 exit 退出,不能直接关! nohup完要 exit 退出,不能直接关! nohup完要 exit 退出,不能直接关! 重 ...
- Ayu vscode主题
Ayu vscode主题
- 1.JAVA中的几种基本数据类型是什么,各自占用多少字节
1.JAVA中的几种基本数据类型是什么,各自占用多少字节 基本类型 大小 最小值 最大值 默认值 byte(位) 8bits = 1字节 -128 127 0 short(短整数) 16bit = 2 ...
- WPF之XAML语法
目录 树形结构 对象属性赋值语法 使用标签的Attribute 使用属性元素 扩展:标记扩展(Markup Extensions) 扩展:使用TypeConverter 类映射Atribute与Pro ...
- BES2300方案设计开发阶段总结
前记 从事BES芯片的方案设计已经快三年了 ,这三年,伴随着和BES的一起共同成长,我们做了不少业内大的客户.从去年年初开始接触2300方案开发,到目前为止,已经做出了不少产品.这里就说一下心得体 ...
- Java Spring Redis 如何向Set中添加List?
调用list.toArray方法将list转成数组,再使用add方法参数传入数组,即可批量添加. redisTemplate.opsForSet().add(key,collect.toArray(n ...