C++;自动关键字-浮点vs整数故障 我对C++比较陌生。我刚刚读到有关类型推断的auto关键字。我试着在几个函数中实现它,结果发现它在处理数学运算符时引发了各种各样的问题。我相信发生的事情是,当我实际需要浮点除法(变量“I”和“avg”)时,我的函数开始实现整数除法。我用下面的自动关键字发布了代码

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

现在,当我显式地将变量声明为float时,函数运行良好

那么,这是一个不喜欢使用auto的例子吗?但是,我可以肯定地看到,它们在生成迭代器时会有所帮助

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;
的用法今天完全有效-尽管过度使用可能会导致混淆。