在以下哪个示例中需要转换?

时间:2018-09-27 12:54:07

标签: 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)
}; 

2 个答案:

答案 0 :(得分:1)

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

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

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

最后,您需要执行的操作取决于您要完成的操作。一个程序的功能就是另一个程序的错误,仅仅是因为这些程序试图实现不同的目标。


请注意,我以面值发表了以下声明:

  

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

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

如果要在除法之前询问是否需要转换,答案仍然取决于您要完成的工作。除法的行为取决于其操作数,而不取决于结果执行的操作。因此,如果操作数是整数,则执行整数除法,即使将结果整数分配给浮点变量,结果也是整数。有时这是需要的。通常不是。

如果由于要存储商的小数部分而将除法结果存储在double中,则需要确保至少一个操作数是浮点值,然后进行分割。 (除了double以外还有浮点类型,因此“不加倍”不足以知道是否需要显式转换。)但是,这实际上是一个独立的主题,而不是这个问题的名义含义,因为这是关于除法运算符,而这个问题名义上是关于存储值。

答案 1 :(得分:0)

您的第一个和第三个示例不会丢失数据,因此我认为它们很好。

您的第二个示例是发生一些数据丢失(整数除法表示结果四舍五入),您可能会这样做:

double x = static_cast<double>(getNotDouble()) / getAnotherNotDouble(); 

其中一个值必须为双精度值,以使返回值也为双精度值。