C++;自动关键字-浮点vs整数故障 我对C++比较陌生。我刚刚读到有关类型推断的auto关键字。我试着在几个函数中实现它,结果发现它在处理数学运算符时引发了各种各样的问题。我相信发生的事情是,当我实际需要浮点除法(变量“I”和“avg”)时,我的函数开始实现整数除法。我用下面的自动关键字发布了代码
现在,当我显式地将变量声明为float时,函数运行良好 那么,这是一个不喜欢使用auto的例子吗?但是,我可以肯定地看到,它们在生成迭代器时会有所帮助C++;自动关键字-浮点vs整数故障 我对C++比较陌生。我刚刚读到有关类型推断的auto关键字。我试着在几个函数中实现它,结果发现它在处理数学运算符时引发了各种各样的问题。我相信发生的事情是,当我实际需要浮点除法(变量“I”和“avg”)时,我的函数开始实现整数除法。我用下面的自动关键字发布了代码,c++,c++11,auto,C++,C++11,Auto,现在,当我显式地将变量声明为float时,函数运行良好 那么,这是一个不喜欢使用auto的例子吗?但是,我可以肯定地看到,它们在生成迭代器时会有所帮助 namespace Probability { /* ExpectedValueDataSet - Calculates the expected value of a data set */ template <typename T, std::size_t N> double Exp
namespace Probability
{
/* ExpectedValueDataSet - Calculates the expected value of a data set */
template <typename T, std::size_t N>
double ExpectedValueDataSet(const std::array<T, N>& data)
{
auto i = 0;
auto avg = 0;
for(auto it = data.begin(); it != data.end(); it++)
{
i = it - data.begin() + 1;
avg = ((i-1)/i)*avg + (*it)/i;
}
std::cout << avg << " \n";
return avg;
}
};
名称空间概率
{
/*ExpectedValueDataSet-计算数据集的预期值*/
模板
双ExpectedValueDataSet(常数std::数组和数据)
{
自动i=0;
自动平均值=0;
for(auto it=data.begin();it!=data.end();it++)
{
i=it-data.begin()+1;
平均值=((i-1)/i)*平均值+(*it)/i;
}
std::cout文本0
的类型为int
变量auto avg=0;
因此具有类型int
文本0.0
(或例如3.14
)的类型为double
,这正是您想要的
作为一般规则,使用auto
进行变量声明,其中
- 类型在初始值设定项中显式指定,或
- 该类型非常冗长,就像某些迭代器类型一样
但不要无缘无故地使用它。:)
如果出于美学原因,您希望将i
保持为整数,则重写计算
((i-1)/i)*avg + (*it)/i
到,例如
((i-1)*avg + *it)/i
为了避免对(i-1)/i
进行纯整数运算,请注意:仅此一点并不能将示例代码更正为(i-1)/i
仍然是0
,因此递归平均值的计算不正确。啊,这很有意义。但是,auto如何区分浮点数和double,例如uint、int或long?@davidhigh,这是i=0的情况,但不是i>0。@Teague:同样。它对函数和d数组。然后,如果希望结果是对数组的引用,则必须与引用类型生成器(例如,&
)相结合。@davidhigh:这个答案不是关于纠正程序逻辑,这不是要求的。不过,除了不正确的类型之外,我看不出逻辑有什么问题。在第一次迭代中,不存在的pr以前的平均值应该是0。免责声明:这里已经很晚了。也许我是瞎子。:)改为写avg=0.0
,并将avg=((I-1)/I)*avg+…
改为avg=((I-1)*avg/I)+…
auto是一个存储类-变量存储在堆栈中,函数返回时会丢失值-您还需要一个类型说明符,因为通过除法auto float avg=0;获得的avg将正常工作。@ArifBurhan在C++11中发生了更改。auto i=0;
的用法今天完全有效-尽管过度使用可能会导致混淆。