3

是我的代码。

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

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

4

4 回答 4

3

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

未指定评估参数的顺序。在这种情况下,它似乎anish是在 之前评估road(len)的,因此传递给的值printf是未修改的值。

road(len)在调用之前进行评估printf并将结果存储在临时变量中。

于 2012-08-30T20:46:30.840 回答
3

您的 c 代码显示一个过时的anish变量连续 printf 显示不同的值

这与c的内部有关

它与此有关:在 C 中调用函数之前的参数评估顺序

洛基阿斯塔里 说:

评估函数参数的顺序是未指定的行为。(这不会使您的程序崩溃、爆炸或订购披萨……不像未定义的行为。)

唯一的要求是在调用函数之前必须对所有参数进行全面评估。

于 2012-08-30T20:42:11.113 回答
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)

有关详细信息,请参阅此。

于 2012-08-30T20:46:23.053 回答
0

If you do it like this, it'll work:

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

may be its because of something inside the printf definition,

于 2012-08-30T20:45:50.747 回答