1

我有以下功能:

      int v[]={0,1,1,1};
      int f(int x)
      {
          if(x>=1)  return v[x]+f(x-1);
          else return 0; 
      }

当我像这样在 main 中调用它时:cout<<f(4);它输出 '4' 但我希望是 '3' 有人可以澄清为什么我得到 '4' 而不是 '3' 吗?(我想我错过了什么)

4

4 回答 4

7

v[4] 未定义。它有 4 个元素,因此最大数组索引为 3。

于 2012-10-18T18:05:29.150 回答
4

任何事情都可能发生,因为这是未定义的行为。C++ 中的数组是从 0 开始的——它们从 0 开始,一直到元素数量—— 1

4是一个完全有效的答案,就像会1042会一样。

v只有索引0...3,除此之外的都是 UB。

于 2012-10-18T18:05:36.563 回答
2

v[4] 有 4 个元素,因此最大索引为 3。数组索引从 0 开始,由于您尚未初始化它,它将最大索引为 3,因为它目前有 4 个元素。

于 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 回答