这是我的代码。
#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 %dn",road(len),anish);
return 0;
}
在这个例子中,road()
是一个递归函数,我想计算这个函数被执行的次数。因此,我通过一个全局变量anish
来实现这一点。但在road()
函数中,anish
的值没有改变,而在f()
函数中anish
的值正在被修改。
这种荒谬行为有什么原因吗?
您的c代码显示了一个过时的anish
变量连续打印的显示不同的值
这与c的内部有关
它与此有关:在C 中调用函数之前的参数评估顺序
洛基·阿斯塔里说:
函数参数的求值顺序未指定行为(这不会使程序崩溃、爆炸或订购披萨不同于未定义的行为。)
唯一的要求是必须对所有参数进行全面评估在调用函数之前。
在中
printf("%d %dn",road(len),anish);
参数的求值顺序未指定。在这种情况下,似乎anish
是在road(len)
之前评估的,因此传递给printf
的值是未修改的值。
在调用printf
之前评估road(len)
,并将结果存储在临时变量中。
试试这个:
int main()
{ int i;
for(i=0;i<=13;i++)
cache[i]=-1;
int len=10;
// f();
printf("%dn",road(len));
printf("%dn", anish);
return 0;
}
最有可能发生的情况是printf()
在road(len)
返回之前使用anish
的值。
有关详细信息,请参阅此。
如果你这样做,它会起作用:
printf("%d ",road(len));
printf("%dn",anish);
可能是因为printf定义中的某些内容,