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 存储为 floatdouble 会更好,对吗?

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 语言:类型转换与常量的细致理解的更多相关文章

  1. Java常量池的理解

    1.常量池的好处常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享.例如字符串常量池,在编译阶段就把所有的字符串文字放到一个常量池中.(1)节省内存空间:常量池中所有相同的字符串常 ...

  2. Java常量字符串String理解

    Java常量字符串String理解 以前关于String的理解仅限于三点:1.String 是final类,不可继承2.String 类比较字符串相等时时不能用“ == ”,只能用  "eq ...

  3. Swift语言指南(一)--语言基础之常量和变量

    原文:Swift语言指南(一)--语言基础之常量和变量 Swift 是开发 iOS 及 OS X 应用的一门新编程语言,然而,它的开发体验与 C 或 Objective-C 有很多相似之处. Swif ...

  4. Go 语言类型转换

    类型转换用于将一种数据类型的变量转换为另外一种类型的变量.Go 语言类型转换基本格式如下: type_name(expression) type_name 为类型,expression 为表达式. 实 ...

  5. 智能合约语言 Solidity 教程系列10 - 完全理解函数修改器

    这是Solidity教程系列文章第10篇,带大家完全理解Solidity的函数修改器. Solidity系列完整的文章列表请查看分类-Solidity. 写在前面 Solidity 是以太坊智能合约编 ...

  6. Go语言类型转换

    类型转换用于将一种数据类型的变量转换为另外一种类型的变量. Go语言类型转换基本格式如下:表达式 T(v) 将值 v 转换为类型 T . Go语言各种类型转换及函数的高级用法:strconv包实现了基 ...

  7. GO语言学习(十七)Go 语言类型转换

    Go 语言类型转换 类型转换用于将一种数据类型的变量转换为另外一种类型的变量.Go 语言类型转换基本格式如下: type_name(expression) type_name 为类型,expressi ...

  8. Delphi VS C语言类型转换对照

    Delphi VS C语言类型转换对照   When converting C function prototypes to Pascal equivalent declarations, it's ...

  9. C语言类型转换原理

    C语言类型转换 int a; a=1.23 这里把1.23赋值给a发生了隐式转换,原理如下: int a; float b=3.14; a=b; b赋值给a的过程:首先找一个中间变量是a的类型(该例中 ...

  10. c语言类型转换注意事项

    转载自: http://blog.csdn.net/zhuimengzh/article/details/6728492 1.隐式转换     C在以下四种情况下会进行隐式转换:        1.算 ...

随机推荐

  1. 机器学习策略篇:详解单一数字评估指标(Single number evaluation metric)

    单一数字评估指标 无论是调整超参数,或者是尝试不同的学习算法,或者在搭建机器学习系统时尝试不同手段,会发现,如果有一个单实数评估指标,进展会快得多,它可以快速告诉,新尝试的手段比之前的手段好还是差.所 ...

  2. jdk17新特性梳理

    jdk17新特性梳理 目录 jdk17新特性梳理 jdk8升级至jdk17新特性梳理 升级jdk17的理由 新特性梳理 可以在接口中定义私有方法,主要为了jdk8的default方法 局部变量可以使用 ...

  3. 骚操作之 持有 ReadOnlySpan 数据

    ReadOnlySpan<T> 可以说现在高性能操作的重要基石 其原理有兴趣的同学可以看 2018 的介绍Span<T>文章 其为了保障大家安全使用做了相应的限制 那么有没方法 ...

  4. kafka消费者的三种模式

    几种不同的注册方式 subscribe方式:当主题分区数量变化或者consumer数量变化时,会进行rebalance:注册rebalance监听器,可以手动管理offset不注册监听器,kafka自 ...

  5. Nebula Graph 源码解读系列 | Vol.06 MATCH 中变长 Pattern 的实现

    目录 问题分析 定长 Pattern 变长 Pattern 与变长 Pattern 的组合 执行计划 拓展一步 拓展多步 保存路径 变长拼接 总结 MATCH 作为 openCypher 语言的核心, ...

  6. 批量删除mysql库中数据

    -- 查询构建批量删除表语句(根据数据库名称) select concat('delete from ', TABLE_NAME, ' where org_id = "<条件id> ...

  7. 如何查看apk安装包源代码??Android反编译apk,解包,打包,签名一体化实测 ,修改图片音频软件名称版本号等入门

    首先下载反编译工具包 下载地址 链接:  https://zly520.lanzoui.com/ibtuxhf7rab 一.反编译工具介绍 首先 如果你想改动图片音频之类的,见末尾! 1.apktoo ...

  8. Python-使用openpyxl读取excel内容

    1. 本篇文章目标 将下面的excel中的寄存器表单读入并构建一个字典 2. openpyxl的各种基本使用方法 2.1 打开工作簿 wb = openpyxl.load_workbook('test ...

  9. 【机器学习】统计学习方法读书笔记-EM算法(期望最大化算法)

    Expectation Maximization,EM算法是带有隐变量的概率模型参数的极大似然估计(MLE为给定参数,观测数据出现/生成的可能性). 如下为<统计机器学习>中对应EM算法的 ...

  10. 超低延时超低功耗的2.4G无线音频收发解决方案特色解析

    为什么是我们?   团队从做芯片开始,一直在无线领域这个圈子里面混.从刚开始的wifi芯片,到后面的bt芯片,再到后面的音频算法,再到后面一起创业,做无线音频解决方案.随着和客户关系的逐渐深入,团队慢 ...