2012-08-30 34 views
3

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

這種荒謬行爲的任何理由?

+0

大聲笑,你不斷改變主意接受哪個答案。 – Chimera

+0

我想接受兩個答案,因爲兩者都是一樣的,但結果是你只能接受一個答案:/ – Amit

+0

如果你覺得我的答案值得,你可以放棄它。點擊0上方的箭頭。感謝您考慮我的答案。 – Chimera

回答

4

你的C代碼展示了一個過時的anish變量 succesive的printf的節目不同的值

這個事做用C的內部

它有事情做與此:Parameter evaluation order before a function calling in C

洛基阿斯塔說:

函數參數的評估順序未指定 行爲。 (這不會使你的程序崩潰,爆炸或訂購 披薩...不像未定義的行爲。)

唯一的要求是所有參數必須在函數調用之前完全評估 。

+0

哪裏?它沒有在Ideone上顯示那樣的東西。 – Amit

+0

add'printf(「%d」,anish);' 'return 0;'之前的 – maazza

+0

我不明白,你能解釋這種行爲http://ideone.com/udtWN。 – Amit

1

如果你像這樣做,它會工作:

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

可能是其因爲printf的定義裏面的東西,

2

試試這個:

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.

4

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

在其中的參數的計算順序是不確定的。在這種情況下,anishroad(len)之前被評估,因此傳遞給printf的值是未修改的值。

在致電printf之前評估road(len)並將結果存儲在臨時變量中。