私は次の機能を持っています:
int v[]={0,1,1,1};
int f(int x)
{
if(x>=1) return v[x]+f(x-1);
else return 0;
}
メインで次のように呼び出すと、cout<<f(4);
「4」が出力されますが、「3」になると予想されます「3」ではなく「4」を取得する理由を誰かが明確にできますか? (私は何かが欠けていると思います)
私は次の機能を持っています:
int v[]={0,1,1,1};
int f(int x)
{
if(x>=1) return v[x]+f(x-1);
else return 0;
}
メインで次のように呼び出すと、cout<<f(4);
「4」が出力されますが、「3」になると予想されます「3」ではなく「4」を取得する理由を誰かが明確にできますか? (私は何かが欠けていると思います)
v[4] は定義されていません。4 つの要素があるため、最大配列インデックスは 3 です。
これは未定義の動作であるため、何でも発生する可能性があります。C++ の配列は 0 ベースです。0 から始まり、要素数 - 1 まで進みます。
4
は完全に有効な答え10
です42
。
v
インデックスのみがあり0...3
、それ以外はすべてUBです。
v [4]には4つの要素があるため、最大インデックスは3です。配列インデックスは0から始まり、初期化していないため、現在4つの要素があるため、最大インデックスは3になります。
の出力
int v[]={0,1,1,1};
int f(int x)
{
if(x>=1) return v[x]+f(x-1);
else return 0;
}
cout << f(4)
x = 3を超える値を取得するため、で呼び出されたときには未定義です。これは正しくありません。配列は0から始まり、配列の範囲は0-> 3(= 4要素)です。
それを修正するには、電話する必要がありますcout << f(3);
また、範囲を確認するには:
内部のこのような簡単なチェックint f(x)
で正しい結果が得られます。
このようなもの:
#define checkRange(x,y) (((sizeof(x)/sizeof(x[0])) >= y)?true:false)
int v[]={0,1,1,1};
int f(int x)
{
if(!checkRange(v,x)){
return 0+f(x-1);
}
if(x>=1) return v[x]+f(x-1);
else return 0;
}