【问题标题】:Unknown output in C++C++ 中的未知输出
【发布时间】:2014-04-21 22:10:51
【问题描述】:

我有奇怪的代码输出。这里我有素数迭代器:

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

【问题讨论】:

  • 为什么要包含 .cpp 文件?你真的不想那样做。我们还需要查看 PrimeIterator.cpp 的内容,因为目前我们还不知道它在做什么。

标签: c++ io


【解决方案1】:

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

因此,在行中

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

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


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

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

此外,在 C++ 中,无需使用#define 将常量定义为宏。相反,只需定义常量,并避免例如阅读全部大写字母会导致意外的文本替换和碍眼。在很大程度上,定义常量是 const 的用途。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    相关资源
    最近更新 更多