Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ “中的条件”;如果;在“中忽略”;至于;环_C++_If Statement - Fatal编程技术网

C++ “中的条件”;如果;在“中忽略”;至于;环

C++ “中的条件”;如果;在“中忽略”;至于;环,c++,if-statement,C++,If Statement,对于以下代码,当输入为: 第一次输入=0 1 2 3 4 5 6 7 8 9 第二个输入=12345678910 它将产生以下产出: 第一次输出=0 第二输出=1 它不采用每个输入四分位,而是采用它的第一个元素,问题是(在测试等之后),它在代码中跟随问题 for (vector<int>::size_type counter = 0; (quartiles < quadro) && (counter < numstore.size()); ++counte

对于以下代码,当输入为:

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

第二个输入=12345678910

它将产生以下产出:

第一次输出=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;
}
for(vector::size_type counter=0;(quartilescout表达式
quartiles/quadro*numstore.size()
在quartiles=1和quadro=4的情况下将为0。这是因为1/4向下舍入为0


也许这就是你的意思:
(quartiles*numstore.size())/quadro
因为
四分位数和
四分位数都是整数,第一个总是小于第二个(因为
for
语句就是这么说的),表达式:

quartiles / quadro * numstore.size()
将始终等于零,因为
quartiles/quadro
是首先计算的。因此,
if
语句只有在循环中第一次为真

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

quartiles * numstore.size() / quadro

四分位数/quadro等于0.25,因为四分位数在
C++
中是int-quartiles/quadro==0

类型,所以当你除以两个整数时,你会得到整数除法。此外,
*
/
具有相同的优先级,所以解析器将其解释为
(四分位数/quadro)*numstore.size()
(1/4)
等于
0

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

通过先乘以以下值,可以得到正确的结果(向下舍入到最接近的整数):

(quartiles * numstore.size()) / quadro
我已经用括号把评估顺序弄清楚了——如果你愿意的话,你可以把它们删掉


注意,对于大的值,你需要小心,乘法不会溢出——也许是转换成更宽的类型,或者是浮点,或者是仔细地乘以和更小的因素来划分。这在这个例子中可能不是问题。C++中的< /P> < P>,除法运算可以被认为是<强>两个不同的OP.rators:一个用于整数操作数,另一个用于浮点操作数。如果操作数是浮点类型,则除法运算符将返回浮点值

尝试:

编辑:由于评论而更正

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

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

您正在进行int运算,因此
1/4==0
我的代码中当然有什么错误?“0==1(四分位数)/4(四分位数)*10(numstore.size()?”omg,thnx vulkanino,你应该把这个放在回答部分,我想…@Vastor:这就是为什么你应该进行简化,将你的代码分解成组件测试用例来缩小问题的范围。这是调试的第一步。@Vastor:根据定义,一个最小的、完整的测试用例是解决问题所需的100%信息,因为你缩小了范围这个小区域的问题:)看起来你已经在脑子里这样做了,所以我会把其他的东西都抽象出来,留下这个:,然后问“这是怎么打印的
真的
?”不。
quartiles
quadro
都是整数,因此在转换结果
0
并将其分配给
浮点值之前,您仍在执行整数除法。实际上,这不起作用,因为计算仍将作为整数进行,然后在分配中转换为浮点值-换句话说,它将ply可能是错误值的浮点等价物。注意到括号仍然失败,我猜结果不是预期的结果。(quartiles*numstore.size()))哇,忘记了整数编程的基本规则真是太遗憾了,我想我真的想哭了……D:虽然这完全是真的,但也完全奇怪(它是这样工作的)!@LightnessRacesinOrbit我的意思是,改变操作数的顺序会完全改变结果,读取代码时不会立即发生,而且很容易出错。在琐碎的算术中
1/4*10=1*10/4
@vulkanino:的确如此。如果你期望变量的行为像实数,那就很奇怪了;如果你明白它们必须是有一个有限的表示法。如此错误,++计数器发生在循环的末尾而不是开始时…你认为int是对的。@Vastor total漏掉了这一点:)更好的方法是添加括号,这样评估就完全清楚了,显然这不适用于原始海报:P
float result = quartiles/(float)quadro * numstore.size();