here是我的代码。
#include <stdio.h>
#define MAX(a,b) ((a)>(b)?(a):(b))
#define SZA(a) (sizeof(a)/sizeof(a[0]))
int anish=0; // global variable showing abrupt behaviour
int a[]={0,1,5,8,9,10,17,17,20,24,30};
int n= SZA(a);
int cache[100];
int road(int len)
{
anish++;
if(cache[len]!=-1)
return cache[len];
if(len<=0)
return 0;
int max=0;
int i;
for(i=1;(i<n && len>=i);i++)
{
max=MAX(max,a[i]+road(len-i));
}
return cache[len]=max;
}
void f()
{
anish=13;
}
int main()
{
int i;
for(i=0;i<=13;i++)
cache[i]=-1;
int len=10;
// f();
printf("%d %d\n",road(len),anish);
return 0;
}
在此,road()
是一个递归函数,我想计算这个函数的执行次数。所以,我通过全局变量anish
来做这件事。
但anish
函数的road()
值未在f()
函数中更改,而函数anish
的值{{1}}正在修改。
这种荒谬行为的原因是什么?
答案 0 :(得分:3)
您的c代码显示过时的anish
变量
成功的printf显示不同的值
这与c的内部相关
它与此有关:Parameter evaluation order before a function calling in C
loki astari说:未指定评估函数参数的顺序 行为。 (这不会使您的程序崩溃,爆炸或订购 披萨......与未定义的行为不同。)
唯一的要求是必须完全评估所有参数 在调用函数之前。
答案 1 :(得分:3)
在
printf("%d %d\n",road(len),anish);
未指定参数的计算顺序。在这种情况下,似乎在anish
之前评估road(len)
,因此传递给printf
的值是未修改的值。
在调用road(len)
之前评估printf
并将结果存储在临时变量中。
答案 2 :(得分:1)
请改为尝试:
int main()
{ int i;
for(i=0;i<=13;i++)
cache[i]=-1;
int len=10;
// f();
printf("%d\n",road(len));
printf("%d\n", anish);
return 0;
}
最有可能发生的事情是printf()
在anish
返回之前使用road(len)
的值。
答案 3 :(得分:0)
如果你这样做,它会起作用:
printf("%d ",road(len));
printf("%d\n",anish);
可能是因为printf定义中的内容,