Question

I have strange output from code. Here I have prime iterator:

#include <iostream>
#include "PrimeIterator.cpp"


int main() {
    PrimeIterator prime(9);

    std::cout << "Prime number " << prime.getN() << " is " << prime.value() << std::endl;
    std::cout << "Next prime number " << " is " << prime.next() << "..." << prime.next() << "..." << prime.next() << std::endl;

    return 0;
}

If I output prime.next() in one raw it gives me strange result: Next prime number is 37...31...29 but not 29...31...37((( If I put them in 3 different raws everything is ok. Please clarify why c++ gives such result... My PrimeIterator:

#include <iostream>
#define MAXPRIME 1000

class PrimeIterator {
private:
    int n;
    int prime[MAXPRIME];
public:
    PrimeIterator( int n ) : n(n) {
        initPrimeArray(n);
    }

    int getN() const {
        return n;
    }
    int isPrime(int primeNumber) {
        if ( primeNumber == 2 || primeNumber == 3 ) {
            return 1;
        } else if ( primeNumber <= 1 || primeNumber % 2 == 0 ) {
            return 0;
        } else {
            for ( int i = 3; i < primeNumber; i += 2 ) {
                if ( primeNumber % i == 0 ) {
                    return 0;
                }
            }
            return 1;
        }
    }

    int value() {
        return prime[n-1];
    }

    void next() {
        int i = 2;

        for ( ; !isPrime(prime[n - 1] + i); i += 2 ) {}
        prime[n] = prime[n-1] + i;
        n += 1;
    }



    void initPrimeArray( int n ) {
        if ( n == 1 ) {
            prime[0] = 2;
        } else if ( n == 2 ) {
            prime[1] = 3;
        } else {
            int count = n - 2;

            for ( int i = 5; i > 0; i += 2 ) {
                if ( isPrime(i) ) {
                    count -= 1;
                }
                if ( count == 0 ) {
                    prime[n-1] = i;
                    break;
                }
            }
        }
    }
};
Was it helpful?

Solution

Argument evaluation order is up to the compiler.

Thus, in the line

std::cout << "Next prime number " << " is " << prime.next() << "..." << prime.next() << "..." << prime.next() << std::endl;

the prime.next() calls can be evaluated in any order that suits the compiler.


In passing, don't #include implementation files unless you really know what you're doing.

You risk getting e.g. multiple definition errors from the linker.

Also, in C++ there is no need to define a constant as a macro, using #define. Instead just define the constant, and avoid e.g. unintended text substitutions and eyesores from reading all uppercase. Defining constants is, in large part, what const is for.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top