当我将它初始化为 -1 时,为什么我的数组会被填充为零

Why would my array would be filled out to zero, when I initialised it to -1

#include<iostream>
using namespace std;

long long int memo[20] = {-1};       //create memo table  and initialise to -1

long long int fibo(long long int n)
{
    if(memo[n]>-1)           //changing this to if(memo[n]>0) works fine
        return memo[n];      //but as such this gives 0 from all my inputs
    if(n<=2)
        return 1;
    memo[n] =  fibo(n-1) + fibo(n-2);    //recurse
    return memo[n];
}

int main()
{
    long long int n;
    cin>>n;
    cout<<fibo(n)<<endl;       //calls the fibo function 
    for(int i=0;i<20;i++)       //this prints my memo table used...
        cout<<memo[i]<<" ";
}

我正在使用自上而下的 dp 计算第 n 个斐波那契数,但我的备忘录 table 被清零了。即使在我不接触的地方,为什么?

因为这就是 C++ 中数组初始化的工作方式。您将数组 memofirst 元素设置为 -1,编译器将 value-initialize (before the C++11 standard) or default-initialize (自 C++11 及以后)所有其他元素。

请详细阅读 aggregate initialization here

long long int memo[20] = {-1}; 实际上将 -1 设置为 仅第一个元素 。此后他们取值 0.

在你的情况下,鉴于斐波那契数列不包含零项,我将使用 0 而不是 -1 作为指标,并写成

long long memo[20] = {}; /*new C++ standards allow this, note that C doesn't*/

相反。

当你有

long long int memo[20] = {-1}; 

您没有告诉编译器用全 -1 初始化数组。你在这里告诉它的是一个初始化列表,并用它的内容初始化数组中的元素。由于列表小于数组,每个缺少的初始化程序都会导致编译器对相应元素进行零初始化。

您只是通过 {-1}.

将第一个元素设置为 -1

以下是 C++ Programming Language Stroustrup 书中关于数组初始化器的摘录:


If the initializer supplies too few elements for an array, 0 is used for the rest. For example:

int v5[8] = { 1, 2, 3, 4 };

is equivalent to

int v5[] = { 1, 2, 3, 4 , 0, 0, 0, 0 };

所以你的情况 long long int memo[20] = {-1}; 属于为数组提供的元素太少

因为行

long long int memo[20] = {-1}; 

表示只有 memo 的第一个元素被初始化为零。

当你只输入"memo"时,它指的是一个指针,它保存着C++中数组第一个元素的地址。仅当由方括号指定时 - 例如 memo[3]-,或者当明确表示类似 "memo+3" 时,它将指向数组的索引。

你想要做的是声明所有索引并用 -1 值初始化它们。

long long int memo[20] = {[0 ... 20] = -1};