我有以下功能:
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'? (我想我错过了什么)
答案 0 :(得分:7)
v [4]未定义。它有4个元素,因此最大数组索引为3。
答案 1 :(得分:4)
任何事情都可能发生,因为这是未定义的行为。 C ++中的数组是基于0的 - 它们从0开始并转到元素数量 - 1 。
4
是完全有效的答案,10
或42
也是如此。
v
只有索引0...3
,除此之外的任何东西都是UB。
答案 2 :(得分:2)
v [4]有4个元素,因此最大索引是3.数组索引从0开始,因为你没有初始化它,所以最大索引为3,因为它目前有4个元素。
答案 3 :(得分: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;
}