使用c ++中的函数初始化const bool数组

时间:2012-09-22 19:03:42

标签: c++ arrays function const

我是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)};
}

这个几乎可以工作,虽然它不是很优雅或节省空间(我会对如何更好地实现这个数组的评论持开放态度)。麻烦的是,返回数组的第0个元素,即primeList,设置为true / 1,即使我已经将我的s_of_e()函数返回的布尔数组中的第0个元素显式设置为false / 0。

primeList[0] == 1

应该是:

primeList[0] == 0

因为0不是素数......

任何人都可以告诉我为什么要这样做?

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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位。

根据一个人的观点,可以将其视为特征或设计级错误。

答案 2 :(得分:0)

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