“for”循环中忽略“if”中的条件

时间:2012-03-08 12:56:48

标签: c++ if-statement

对于以下代码,输入为:

  

第一次输入= 0 1 2 3 4 5 6 7 8 9

     

第二次输入= 1 2 3 4 5 6 7 8 9 10

它将产生以下输出:

  

第一个输出= 0

     

第二次输出= 1

而不是取每个输入四分位数它取第一个元素,问题是(在测试之后),它跟随代码中的问题

for (vector<int>::size_type counter = 0; (quartiles < quadro) && (counter < numstore.size()); ++counter)
{
    if (counter == (quartiles/quadro * numstore.size()))
    {
        quaele.push_back(numstore[counter]);
        if ((quartiles == 2) && (numstore.size() / 2 == 0))
            quaele[quartiles-1] = (numstore[counter]+numstore[counter-1]) / 2;
        ++quartiles;
    }
    // test
    cout << quartiles;
}

其中“if function”中的条件不起作用,我的意思是第一个循环,counter == 00 == 1(quartiles)/4(quadro) * 10(numstore.size()怎么可能?

6 个答案:

答案 0 :(得分:4)

因为quartilesquadro都是整数,而第一个总是小于第二个(因为那是for语句所说的),表达式为:

quartiles / quadro * numstore.size()

总是等于零,因为首先计算quartiles / quadro。因此,if语句只有在第一次循环时才会成立。

您可以通过重新安排计算来解决这个问题:

quartiles * numstore.size() / quadro

答案 1 :(得分:2)

这就是整数运算的工作原理。 1/4被截断为零。

您可以通过先乘以

来获得正确的结果(向下舍入到最接近的整数)
(quartiles * numstore.size()) / quadro

我已经使用括号使评估顺序清晰 - 如果您愿意,可以将它们排除在外。

请注意,对于较大的值,您需要注意乘法不会溢出 - 可能是通过转换为更宽的类型或浮点,或者通过小心地乘以除以较小的因子。在这种情况下,这可能不是问题。

答案 2 :(得分:0)

对于四分位数= 1且quadro = 4的情况,表达式quartiles/quadro * numstore.size()将为0.这是因为1/4向下舍入为0.

也许这就是你的意思:(quartiles * numstore.size()) / quadro

答案 3 :(得分:0)

quartiles / quadro等于0.25,因为四分位数是int quartiles / quadro == 0

答案 4 :(得分:0)

C++中,当你除以两个整数时,你得到整数除法。此外,*/具有相同的优先级,因此解析器将其解释为(quartiles / quadro) * numstore.size()(1 / 4)等于0

答案 5 :(得分:0)

在C ++中,除法运算符可以被认为是两个不同的运算符:一个用于整数操作数,另一个用于浮点操作数。如果操作数是浮点类型,则除法运算符将返回浮点值。

http://www.learncpp.com/cpp-programming/eight-c-programming-mistakes-the-compiler-wont-catch/

尝试:

float result = quartiles/quadro * numstore.size();

编辑:感谢评论。

float result = quartiles/(float)quadro * numstore.size();

将其中一个操作数转换为浮点数就足够了。