1

私は次の機能を持っています:

      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」を取得する理由を誰かが明確にできますか? (私は何かが欠けていると思います)

4

4 に答える 4

7

v[4] は定義されていません。4 つの要素があるため、最大配列インデックスは 3 です。

于 2012-10-18T18:05:29.150 に答える
4

これは未定義の動作であるため、何でも発生する可能性があります。C++ の配列は 0 ベースです。0 から始まり、要素数 - 1 まで進みます。

4は完全に有効な答え10です42

vインデックスのみがあり0...3、それ以外はすべてUBです。

于 2012-10-18T18:05:36.563 に答える
2

v [4]には4つの要素があるため、最大インデックスは3です。配列インデックスは0から始まり、初期化していないため、現在4つの要素があるため、最大インデックスは3になります。

于 2012-10-18T18:06:15.507 に答える
0

の出力

      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; 
  }
于 2012-10-18T18:11:34.703 に答える