while循环评估条件

时间:2018-02-03 20:44:48

标签: c++ while-loop

很抱歉,如果这个问题看起来真的很微不足道,但我只是在学习如何编码,这个让我在电脑前停留了大约2个小时而没有意识到为什么会发生这种情况。

我会传递以下代码。 所以,为了保持简单:

isPrime()是一个只检查当前号码是否为Prime的函数。

nPrime()是一个返回n-ism素数的函数,给定N作为参数。

这里的关键点是主要功能,更准确地说,是第一次循环中的数值

如果运行此代码,当它到达 number 可分割的最后一个素数时,它将进入无限循环。如果您只是将第一个条件从 while(number> 0)更改为 while(number> 1),则可以轻松解决此问题。

这是我无法意识到的奇怪事情: 如果内部第二个while循环不会退出 number%nPrime(index)!= 0 ,并且的最后一条指令首先在循环 number / = nPrime(index); ,程序如何进入无限循环?

最后一条指令将数字的值设置为0,因此第一个while循环条件应返回 false 并退出循环。

我错过了什么?

感谢大家的时间和耐心。

PS:我得到了投票,我不知道为什么,所以我会澄清一下:

我做了研究。据我所知,每个消息来源似乎都同意这一点:

>当且仅当左操作数大于右操作数时,condition返回true。

这让我看到之前写的问题:如果数字 等于为0,那么while循环如何不评估数字> 0 false 并退出迭代?

#include <iostream>
using namespace std;

bool isPrime(int);
int nPrime(int);


int main() {


    int number = 264;

    if (number > 0)
    {
        int index = 1;

        while(number > 0)
        {
            while (number % nPrime(index) != 0)
            {
                index++;
            }
            cout << nPrime(index) << endl;
            number /= nPrime(index);
        }

    }

    else
        cout << "Error";


    return 0;
    }


bool isPrime(int n)
{
    bool isPrime = false;
    int totalDividends = 0;

        for (int i = 1; i <= n; ++i)
        {
            if (n % i == 0)
                totalDividends++;
        }


    if(totalDividends == 2)
         isPrime = true;

    return isPrime;
}

int nPrime(int n)
{
    int result = 0;

    for (int i = 0; i < n; ++i)
    {
        do
        {
            result++;
        } while (!isPrime(result));
    }

    return result;
}   

1 个答案:

答案 0 :(得分:2)

  

我错过了什么?

     

最后一条指令将数字的值设为0

不,它没有,它永远不会那么远。当数字等于1时,number % nPrime(index) != 0总是为真,因此内部while循环永远不会退出。

您对while循环的理解是完美的,这是您对自己的代码所做错误的理解。对于像这样的错误,这是正常的。