首页 > 解决方案 > 如果在一个while循环内导致麻烦

问题描述

我在程序的最后一部分遇到了麻烦。p[j]该代码用输入数字减去一个数组,nStevilo然后放入绝对值。然后它将结果与数组的减法进行比较p[j++]。代码应该遍历数组并找到最小值并将其附加到najblizjeStevilo中,但由于某种原因它不起作用?

while (j < 20){
        if (abs(p[j] - nStevilo) < abs(p[j++] - nStevilo)){
            najblizjeStevilo = p[j];
        }
    }

该数组包含 20 个素数,从 2 (2, 3, 5, 7, 11...) 开始,所以p[0]= 2, p[1]= 3...

标签: c++arraysif-statementwhile-loop

解决方案


您依赖的是不存在的测序。您假设j仅在比较的左侧完成运行后才会增加。C++ 标准没有这样的保证。j因此,由于在没有正确排序的情况下以一个完整的表达式修改和读取程序,因此您的程序具有未定义的行为。

与其聪明和写作,不如j++明确说明事情需要如何排序:

while (j < 20){
        if (abs(p[j] - nStevilo) < abs(p[j + 1] - nStevilo)){
            ++j;
            najblizjeStevilo = p[j];
        }
    }

推荐阅读