C ++中的未知输出

时间:2014-04-21 22:10:52

标签: c++ io

我的代码输出很奇怪。这里我有主要的迭代器:

#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;
}

如果我在一个原始输出prime.next(),它给我奇怪的结果: 下一个素数是37 ... 31 ... 29但不是29 ... 31 ... 37(((如果我把它们放在3个不同的原始数据中,一切都还可以。请说明为什么c ++会给出这样的结果...... 我的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;
                }
            }
        }
    }
};

1 个答案:

答案 0 :(得分:1)

参数评估顺序取决于编译器。

因此,在行

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

prime.next()调用可以按任何适合编译器的顺序进行评估。


顺便说一下,除非你真的知道自己在做什么,否则不要#include实施文件。

你冒险得到例如来自链接器的多个定义错误。

此外,在C ++中,不需要使用#define将常量定义为宏。相反,只需定义常量,并避免例如读取全部大写的非预期的文本替换和眼睛。在很大程度上,定义常量是const的用途。