我有以下功能:
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' 吗?(我想我错过了什么)
我有以下功能:
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' 吗?(我想我错过了什么)
v[4] 未定义。它有 4 个元素,因此最大数组索引为 3。
任何事情都可能发生,因为这是未定义的行为。C++ 中的数组是从 0 开始的——它们从 0 开始,一直到元素数量—— 1。
4
是一个完全有效的答案,就像会10
或42
会一样。
v
只有索引0...3
,除此之外的都是 UB。
v[4] 有 4 个元素,因此最大索引为 3。数组索引从 0 开始,由于您尚未初始化它,它将最大索引为 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)
因为它的值超出 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;
}