我是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不是素数......
任何人都可以告诉我为什么要这样做?
答案 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
。