Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在这些例子中,哪一个是必要的转换?_C++ - Fatal编程技术网

C++ 在这些例子中,哪一个是必要的转换?

C++ 在这些例子中,哪一个是必要的转换?,c++,C++,这里有三个例子,我从一个函数中得到一个数字,这个函数有一些普通的非双精度类型(可能是某种int,某种size\t,等等),并且需要将它存储在双精度中 我的问题是,代码是否与所有三个示例中的代码一样好,还是需要进行一些转换 double x = getNotDouble(); //Set x = some number. //Set x equal to division between two non-doubles: double x = getNotDouble() / getAnothe

这里有三个例子,我从一个函数中得到一个数字,这个函数有一些普通的非双精度类型(可能是某种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 x = static_cast<double>(getNotDouble()) / getAnotherNotDouble(); 
double x=static_cast(getNotDouble())/getAnotherNotDouble();

其中一个值必须是双精度的,才能使返回值也是双精度的

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

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

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

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


请注意,我以表面价值接受了以下陈述:

我从一个函数[…]中得到一个数字,需要将其存储在一个double中

对于第二个示例,存储在double中的值是
getNotDouble()/getAnotherNotDouble()
。为了使其符合语句,我需要从数学意义上而不是编程意义上解释“函数”。也就是说,除法是一个“函数”,它产生要存储在double中的值。否则,我将有两个数字从两个C++函数,这是不一致的“从一个函数的数字”。所以我把这个问题理解为询问除法后是否需要转换

如果目的是询问在除法之前是否需要转换,那么答案仍然取决于您想要完成什么。除法的行为取决于它的操作数,而不是结果的处理方式。因此,如果操作数是整数,则执行整数除法,并且结果是整数,即使结果整数随后被赋给浮点变量。有时这是需要的。通常不会


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

整数运算只使用整数。以
1/2
为例,即使将结果分配给浮点变量,结果也将是
0
。具体取决于您想要的结果。在一些罕见的情况下,甚至将整数除法的结果赋给一个double也可以很好。关于这一点,你想知道的一切都可以在这里找到:取决于你所说的“必要”。第一个示例:隐式发生转换。第二个示例,必须将至少一个函数的返回值显式转换为
double
,否则除法是整数除法,然后将除法的整数结果(隐式)转换为
double
。如果
myClass
的构造函数被传递了一个
int
,它将被隐式转换为
double
,除非
myClass
有另一个带整型参数的构造函数。这些示例不会编译。发布真实代码。