首页 > 解决方案 > 在这些例子中,哪些是需要转换的?

问题描述

这里有三个例子,我从一个具有一些通用非双精度类型(可能是某种 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)
}; 

标签: c++

解决方案


严格来说,只要将一种类型的值赋给另一种类型的变量,就会使用转换。在这方面,在所有三种情况下都需要进行转换,因为所有三种情况都将非double值分配给double变量。

但是,需要转换与需要指定转换不同。一些转换是由编译器自动提供的。发生这种情况时,您无需指定转换,除非自动转换不是您想要的。因此,是否需要指定转换取决于您想要实现的目标。

您的三个案例中的每一个在某些情况下都是正确的,但不一定在所有情况下都是正确的。同时,您的三个案例中的每一个都可以通过显式转换来增强,这至少可以提醒未来的程序员(包括您!)转换是有意的。当涉及整数和除法时,这可能特别有用,因为显式转换可以确认意图是在整数除法double 之后转换(删除小数部分)。

最后,你需要做什么取决于你想要完成什么。一个程序的功能是另一个程序的错误,仅仅是因为这些程序寻求实现不同的目标。


请注意,我从表面上接受了以下声明:

我从一个函数中得到一个数字 [...] 并且需要将它存储在一个双精度数中。

对于第二个示例,存储在 double 中的值是getNotDouble() / getAnotherNotDouble(). 为了使这符合陈述,我需要从数学意义上解释“函数”,而不是从编程意义上解释。也就是说,除法是产生要存储在双精度值中的值的“函数”。否则我会从两个C++ 函数中得到两个数字,这与“来自函数的数字”不一致。因此,我将问题阅读为询问除法后是否需要转换。

如果意图是在除法之前询问是否需要转换,答案仍然取决于您要完成的任务。除法的行为取决于它的操作数,而不是对结果的处理。因此,如果操作数是整数,则执行整数除法,即使结果整数随后分配给浮点变量,结果也是整数。有时这是需要的。往往不是。

如果double因为要存储商的小数部分而将除法的结果存储在 a 中,那么在执行除法之前,您需要确保至少有一个操作数是浮点值。(除了 之外还有浮点类型double,因此“非双精度”不足以知道是否需要显式转换。)但是,这实际上是一个单独的主题,而不是这个问题名义上的主题,因为这是关于除法运算符,而问题名义上是关于存储值的。


推荐阅读