显示突然行为的全局变量

时间:2012-08-30 20:34:44

标签: c recursion global-variables

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}}正在修改。

这种荒谬行为的原因是什么?

4 个答案:

答案 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)的值。

See this for the details.

答案 3 :(得分:0)

如果你这样做,它会起作用:

printf("%d ",road(len));
printf("%d\n",anish);

可能是因为printf定义中的内容,