c++ - 如果在一个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...
解决方案
您依赖的是不存在的测序。您假设j
仅在比较的左侧完成运行后才会增加。C++ 标准没有这样的保证。j
因此,由于在没有正确排序的情况下以一个完整的表达式修改和读取程序,因此您的程序具有未定义的行为。
与其聪明和写作,不如j++
明确说明事情需要如何排序:
while (j < 20){
if (abs(p[j] - nStevilo) < abs(p[j + 1] - nStevilo)){
++j;
najblizjeStevilo = p[j];
}
}
推荐阅读
- typescript - es6 类函数中的 this[functionName] 导致“元素隐式具有 'any' 类型,因为字符串类型的表达式不能用于索引”
- java - 如何在对象列表中使用@JsonUnwrapped
- python - 是否可以将本地 Python 应用程序连接到 Azure OIDC?
- azure-ad-b2c - 注销 B2C 挂起
- node.js - 数组对象NodeJS的访问值
- flutter - GestureDetector 不符合 CustomPaint child 正确
- javascript - 如何在 HighCharts 饼图/甜甜圈图中垂直居中标题?
- python - 熊猫过滤器和分组,然后是
- docker - 使用自托管容器化代理在 Azure DevOps 中安装 docker 卷问题
- python - 如何在 Python Telegram Bot 中设置等待用户输入