我的代码输出很奇怪。这里我有主要的迭代器:
#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;
}
}
}
}
};
答案 0 :(得分:1)
参数评估顺序取决于编译器。
因此,在行
std::cout << "Next prime number " << " is " << prime.next() << "..." << prime.next() << "..." << prime.next() << std::endl;
prime.next()
调用可以按任何适合编译器的顺序进行评估。
顺便说一下,除非你真的知道自己在做什么,否则不要#include
实施文件。
你冒险得到例如来自链接器的多个定义错误。
此外,在C ++中,不需要使用#define
将常量定义为宏。相反,只需定义常量,并避免例如读取全部大写的非预期的文本替换和眼睛。在很大程度上,定义常量是const
的用途。