C++ 我应该用0或0.0初始化浮点(双精度,浮点)变量吗?
我的问题是: 我应该用C++ 我应该用0或0.0初始化浮点(双精度,浮点)变量吗?,c++,c,floating-point,initialization,ieee-754,C++,C,Floating Point,Initialization,Ieee 754,我的问题是: 我应该用0初始化浮点变量,如double或float还是0.0(当然,如果我想用一个等于0的值初始化它) 例如: double var = 0.0; 与之相比: double var = 0; 这有区别吗 对于C和C++是开放的,因为我和两个都一起工作,不想重复两个问题。如果这两种语言之间存在显著差异,尤其是在这种情况下,请说明您关注的是哪种语言 使用C++的半眼睛,构造函数的情况也可能对主题产生影响,当然初始化通常是C++中更广泛的主题,但我不知道这是否影响了答案。 非常感
0
初始化浮点变量,如double
或float
还是0.0
(当然,如果我想用一个等于0
的值初始化它)
例如:
double var = 0.0;
与之相比:
double var = 0;
这有区别吗
<问题>对于C和C++是开放的,因为我和两个都一起工作,不想重复两个问题。如果这两种语言之间存在显著差异,尤其是在这种情况下,请说明您关注的是哪种语言
使用C++的半眼睛,构造函数的情况也可能对主题产生影响,当然初始化通常是C++中更广泛的主题,但我不知道这是否影响了答案。
非常感谢。正如@NathanOliver评论的那样,在这种情况下没有什么区别。但总是说出你的意思是一个好习惯:
double var = 0.0;
这种习惯会在一些地方得到回报,比如std::accumulate
:
std::vector<double> v{1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0, 10.1};
double sum = std::accumulate(v.begin(), v.end(), 0); // 0 here is wrong!
所以
0
导致T
为int
double您可以这样初始化:
double test = 0.0;
但是,如果要100%正确执行,必须像这样初始化浮点:
float test = 0.0f;
f
表示它前面的数字是一个浮点数。如果省略它,数字将被解释为double并自动转换回float,因为您的变量是float类型。不使用f
不会造成任何实际问题,但会引入不必要的开销。我相信当您仅用0而不是0.0初始化double时,也会发生类似的情况,但我不确定这一部分。这没有任何区别,但可能会向读者展示其意图。尝试两种方法,查看生成的代码,看看它有什么区别(如果有)。在这种情况下,它没有区别。也就是说,如果你有类似于std::vector foo=stuff;std::累加(foo.begin(),foo.end(),0)
它有很大的不同,因为现在累计
使用int
而不是双精度
。因此,请使用与类型匹配的文本,这样会减少问题的发生。@Someprogrammerdude,这是个错误的建议。仅仅因为一个特定的编译器以一种方式生成代码并不意味着标准要求它以这种方式生成代码。@NathanOliver@Monica实际上我希望标准能够提供这些。。。我仍然认为<代码>未签名的长n=7 < /代码>优>代码> AutoN=7UL(我之前的最后一个例子)。恭喜找到一个有实际差异的用例。@ MalksOM找到了它的硬方法,并且一直孜孜不倦地学习我的<代码> 0版/代码> S和<代码> 0 s!嗯,事实上,内森发现这一点要快一点(见问题的评论)——那么他的桂冠呢?@Aconcagua是的,他在我回答之前发表了评论,但老实说,这是我想到的第一件事。@NathanOliver说得很对!它应该使用迭代器value\u type
。开销?至少不是在运行时,转换已经在编译时完成;编译器内部会发生什么我不知道,不过…@Anteino非常感谢你的回答,Anteino。我不知道浮点值会自动解释为double
值,也不知道使用格式说明符尾随数字常量的惯例。你有推荐信吗?可能是标准中的相应部分?那太好了。嘿,伙计,谢谢,没问题。这是一位老师在一次讲座中告诉我的。我会尽量找到推荐人,如果找不到的话,我会问他。你不需要花这么大的力气。我不想骚扰你。非常感谢你的帮助和提示。我也会为此进行研究,;-)非常感谢。不,没关系,现在我想知道。我的教授说,他不确定这种开销是否是在编译时引入的。为此,我必须检查汇编代码。我将编辑我的答案,因为我发现更多。
float test = 0.0f;