0

我是 C++ 新手。我想要一个一定长度的 const 数组。这是一个相当长的数组,因此初始化常量数组的标准方法,即:

const bool some_array[] = {true, false, true};

是不切实际的。我想初始化一个布尔值的常量数组。我试图像这样实现它:

bool* sieve_of_eratosthenes(bool* n, n_length);

int main(){
    bool b[500];
    bool primeList[] = {sieve_of_eratosthenes(b, 500)};
}

几乎可以工作,尽管它不是很优雅或节省空间(我愿意就如何更好地实现这个数组发表评论)。问题是,返回数组的第零个元素,即 primeList,被设置为 true/1,即使我已经明确地将我的 s_of_e() 函数返回的布尔数组中的第零个元素设置为 false/0。

primeList[0] == 1

什么时候应该:

primeList[0] == 0

因为 0 不是素数...

谁能启发我为什么要这样做?

4

3 回答 3

3
bool primeList[] = {sieve_of_eratosthenes(b, 500)};

这不像你想象的那样工作。内置类型都可以转换为bool,0(当然包括 NULL)将转换为 false,其他任何内容都将转换为 true。发生的情况是数组的第一个元素设置为 true,因为您返回一个非 NULL 指针。就是这样,数组是 1 个元素长,因为您没有明确指定大小并且只提供了 1 个初始化程序。

于 2012-09-22T19:09:23.980 回答
1

你的代码,

bool* sieve_of_eratosthenes(bool* n, n_length);

int main(){
    bool b[500];
    bool primeList[] = {sieve_of_eratosthenes(b, 500)};
}

不起作用,因为

  • 该函数返回一个指针,而不是一个数组,并且

  • 即使函数返回了对数组的引用,它在初始化列表中的使用中也会衰减为指针。

(而且它不应该编译,因为隐式int从未成为 C++ 的一部分。)

指针转换为bool,这是您的数组获得的唯一元素。

相反,请执行以下操作:

#include <vector>
using namespace std;

vector<bool> sieve_of_eratosthenes( int const n_length )
{
    // Code here.
}

int main()
{
    std::vector<bool> const primeList = sieve_of_eratosthenes( 500 );
}

但是请注意,std::vector它旨在优化bool元素的情况,普通的 C++ 实现每个元素仅使用 1 位。

这可以被视为一个特性或一个设计级别的错误,这取决于一个人的观点。

于 2012-09-22T19:35:02.277 回答
0

数组和指针是不同的东西。您正在创建一个数组,但在第一个元素的初始化列表中使用了一个指针。指针将被转换为bool,因为它不是空指针,所以它变成true.

于 2012-09-22T19:08:16.997 回答