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

あなたのcコードは古いanish変数を示しています連続したprintfは異なる値を示しています

これはcの内部と関係があります

これと関係があります:Cで関数を呼び出す前のパラメータ評価順序

ロキアスタリは言った:

関数パラメーターが評価される順序は、不特定の動作です。(これにより、未定義の動作とは異なり、プログラムがクラッシュしたり、爆発したり、ピザを注文したりすることはありません。)

唯一の要件は、関数を呼び出す前にすべてのパラメーターを完全に評価する必要があることです。

于 2012-08-30T20:42:11.113 に答える
3

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

引数が評価される順序は指定されていません。この場合、のanish前に評価されているように見えるroad(len)ため、渡される値printfは変更されていない値です。

road(len)呼び出す前に評価printfし、結果を一時変数に格納します。

于 2012-08-30T20:46:30.840 に答える
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;
}

ほとんどの場合、発生しているのは、returnの前printf()の値を使用していることです。anishroad(len)

詳細はこちらをご覧ください。

于 2012-08-30T20:46:23.053 に答える
0

あなたがこのようにそれをするならば、それはうまくいくでしょう:

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

printf定義内の何かが原因である可能性があります。

于 2012-08-30T20:45:50.747 に答える