Глобальная переменная, показывающая резкое поведение

здесь - это мой код.

#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;
}
</n></stdio.h>

В этом road() является рекурсивной функцией, и я хочу рассчитать количество раз, когда эта функция выполняется. Итак, я делаю это с помощью глобальной переменной anish. Но значение anish не изменяется в этой функции road(), а в функции f() изменяется значение anish.

Любая причина для этого абсурдного поведения?

4 ответа

ваш код c показывает устаревшую переменную anish succesive printf показывает другое значение

это как-то связано с внутренними элементами c

он имеет какое-то отношение к этому: Порядок оценки параметров перед вызовом функции в C

loki astari сказал:

Порядок оценки параметров функции неуточнен поведение. (Это не приведет к сбою, взрыву или заказу вашей программы пицца... в отличие от поведения undefined.)

Единственное требование состоит в том, чтобы все параметры были полностью оценены перед вызовом функции.


В

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

порядок, в котором оцениваются аргументы, не определен. В этом случае, кажется, anish оценивается до road(len), поэтому значение, переданное в printf, является неизмененным значением.

Оцените road(len) перед вызовом printf и сохраните результат во временной переменной.


Попробуйте это вместо:

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) вернется.

Подробнее см. ниже.


Если вы сделаете это так, это сработает:

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

может быть его из-за чего-то внутри определения printf,

licensed under cc by-sa 3.0 with attribution.