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

Initializing a const bool array using a function in c++

本文关键字:const 布尔 数组 初始化 函数 c++ 使用      更新时间:2023-10-16

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

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/zero。

primeList[0] == 1

何时应为:

primeList[0] == 0

由于 0 不是素数...

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

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

这并不像你想象的那样工作。内置类型都可以转换为 bool,0(当然包括 NULL)将转换为 false,其他任何类型都将转换为 true。那里发生的情况是数组的第一个元素设置为 true,因为您返回一个非 NULL 指针。就是这样,数组的长度为 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 位。

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

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