为什么我的for循环永远不会结束?

时间:2015-02-16 23:47:27

标签: c++ c++11 for-loop

所以,我有这个代码,应该将每个要测试的范围添加到'freqDistRanges'向量中。 'values'是double类型的向量,用于保存用户输入。我的问题是,如果我在'values'数组中输入少于10个值,for循环永远不会结束。我不明白为什么会这样,例如,如果只输入一个值,则freqDistRange将等于0.1。当我>时,for循环将停止0.1和i在第二次迭代时等于0.1,在第二次迭代时为0.2,这应该结束for循环。我在这里想念的是什么,我觉得这很简单,我忽略了。谢谢你的帮助。

double freqDistRange = ((double)values.size() / 10); // there will be ten ranges

// add each range to the 'ranges' vector
for (auto i = 0; i <= ((double)values.size() * freqDistRange); i +=     freqDistRange)
        freqDistRanges.push_back(i);

2 个答案:

答案 0 :(得分:4)

i此处为int,只能保存整数值。如果i0,并且您向其添加了0.1,那么它仍然是0。如果您将0.1添加到其中一百万次,则 0

你应该改变:

auto i = 0;

要么:

double i = 0;

或:

auto i = 0.0;

如果您必须确保选择所需类型的初始值,则在此特定情况下使用auto没有任何好处。如果您知道自己需要输入double类型,则可以明确地将其声明为double

答案 1 :(得分:1)

问题在于您打算将double作为循环计数器,但auto i = 0;根据0推导出类型为int的{​​{1}}。在auto循环中使用for时,这是一个需要注意的陷阱。 See here关于该主题的另一个SO问题。

但是,如果您想要完全有11个步骤,那么使用double作为变量类型是一个好主意。这是因为浮点运算本身并不完全精确,因此由于舍入误差,您可以获得10或12步。

要获得精确的行为,请使用整数类型作为循环计数器。这里:

double freqDistRange = values.size() / 10.0;

for (int i = 0; i <= 10; ++i)
{
    freqDistRanges.push_back( i * freqDistRange );
}