c-显示突然行为的全局变量



这是我的代码。

#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定义中的某些内容,

相关内容

  • 没有找到相关文章

最新更新