首页 > 解决方案 > 无法打破c ++中的无限循环

问题描述

所以我首先在 python 中编写了一个脚本来测试我正在尝试做的事情是否有效,因为我熟悉它(并且确实如此)。它在每个循环中打印 1 到 10 并继续执行此操作。

fullCircle = 2*3.14159
numberOfPoints = 10

def gen():
    angle = 0
    points  = []
    while angle < fullCircle:
        angle += (1 / numberOfPoints) * fullCircle
        points.append(angle)
        print(len(points))


while True:
    gen()

然后我尝试在 c++ 中编写完全相同的代码,但由于某种原因,循环没有中断,并且即使在之后角度继续增加angle < fullCircle ,我也不知道为什么。

#include <iostream>
#include <vector>

float fullCircle =  2 * 3.14159f;
int numberOfPoints = 10;
std::vector<float> points;

void gen()
{
    float angle = 0;
    points.clear();

    while (angle < fullCircle)
    {
        angle += (1 / numberOfPoints) * fullCircle;
        points.push_back(angle);
        std::cout << points.size() << std::endl;
    }
}

int main()
{
    while (true)
        gen();
}

标签: c++

解决方案


在本声明中:

angle += (1 / numberOfPoints) * fullCircle;

numberOfPoints是一个int集合10整数​​除法(1 / numberOfPoints)也是。在普通算术中,是,但整数不能有小数,所以在这种情况下 的结果是 的数值,因此是,因此不会改变值。(1 / 10)0.1(1 / 10)00 * fullCircle0angle

如果运算符的操作数之一/被更新为floatdouble 然后将使用浮点除法,导致浮点0.1,因此0.1 * fullCircle不会导致0,因此angle将更改值。

最简单的改变是这样的:

float numberOfPoints = 10; // or double

但是其中之一也可以:

int numberOfPoints = 10;
...
angle += (1 / float(numberOfPoints)) * fullCircle;
int numberOfPoints = 10;
...
angle += (1.0f / numberOfPoints) * fullCircle;

推荐阅读