c++ - 在这些例子中,哪些是需要转换的?
问题描述
这里有三个例子,我从一个具有一些通用非双精度类型(可能是某种 int、某种 size_t 等)的函数中获取一个数字,并且需要将它存储在一个双精度数中。
我的问题是,所有三个示例中的代码都很好,还是我需要进行一些转换?
double x = getNotDouble(); //Set x = some number.
//Set x equal to division between two non-doubles:
double x = getNotDouble() / getAnotherNotDouble();
//Take non-double in constructor
class myClass
{
double x
myClass(someType notDoublex) : x(NotDoublex)
};
解决方案
严格来说,只要将一种类型的值赋给另一种类型的变量,就会使用转换。在这方面,在所有三种情况下都需要进行转换,因为所有三种情况都将非double
值分配给double
变量。
但是,需要转换与需要指定转换不同。一些转换是由编译器自动提供的。发生这种情况时,您无需指定转换,除非自动转换不是您想要的。因此,是否需要指定转换取决于您想要实现的目标。
您的三个案例中的每一个在某些情况下都是正确的,但不一定在所有情况下都是正确的。同时,您的三个案例中的每一个都可以通过显式转换来增强,这至少可以提醒未来的程序员(包括您!)转换是有意的。当涉及整数和除法时,这可能特别有用,因为显式转换可以确认意图是在整数除法double
之后转换(删除小数部分)。
最后,你需要做什么取决于你想要完成什么。一个程序的功能是另一个程序的错误,仅仅是因为这些程序寻求实现不同的目标。
请注意,我从表面上接受了以下声明:
我从一个函数中得到一个数字 [...] 并且需要将它存储在一个双精度数中。
对于第二个示例,存储在 double 中的值是getNotDouble() / getAnotherNotDouble()
. 为了使这符合陈述,我需要从数学意义上解释“函数”,而不是从编程意义上解释。也就是说,除法是产生要存储在双精度值中的值的“函数”。否则我会从两个C++ 函数中得到两个数字,这与“来自函数的数字”不一致。因此,我将问题阅读为询问除法后是否需要转换。
如果意图是在除法之前询问是否需要转换,答案仍然取决于您要完成的任务。除法的行为取决于它的操作数,而不是对结果的处理。因此,如果操作数是整数,则执行整数除法,即使结果整数随后分配给浮点变量,结果也是整数。有时这是需要的。往往不是。
如果double
因为要存储商的小数部分而将除法的结果存储在 a 中,那么在执行除法之前,您需要确保至少有一个操作数是浮点值。(除了 之外还有浮点类型double
,因此“非双精度”不足以知道是否需要显式转换。)但是,这实际上是一个单独的主题,而不是这个问题名义上的主题,因为这是关于除法运算符,而问题名义上是关于存储值的。
推荐阅读
- python - Python:将分钟或秒添加到仅限时间的对象
- java - 我们怎么能在一定范围内,最大次数,一个int能被2整除
- mysql - 从表中删除数据而不创建临时表
- ios - Swift:重构 NSMutableAttributedString
- zk - 如何使用动态文本框创建通信
- mule - Mule 是否支持键中的“-”(连字符)?
- javascript - 带有 JQuery 事件的条码阅读器
- ios - 当我使用 UIDocumentPickerViewController 从 iCloud 中选择 zip 文件时无法与帮助应用程序通信
- google-cloud-platform - BigQuery 命令“bq mk”引发错误“mk 操作中的 BigQuery 错误:读取架构时出错:”
- mysql - 如何使用 linq2db 将聚合映射到单个表