2009-09-01 86 views
0

我在玩一些遞歸,並試圖計算遞歸fib函數(以下代碼)中的添加數。問題是,g_add從不被打印爲零(0)。在調試器中它設置正確,但不會正確打印。事實上,下面的代碼被修改了一下,以便理智檢查其他一切是否正常。在現實生活中,g_add設置爲零最初,不低於10,但看的輸出打印...全局變量在visual studio中不能正確打印

volatile int g_add = 10; 
int rfib(int n) 
{ 
    if(n == 0) return 0; 
    else if(n == 1) return 1; 
    else { 
     ++g_add; 
     return rfib(n-1) + rfib(n-2); 
    } 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    printf("Fib: %d\n", g_add); 
    for(int n =0; n<6;n++,g_add = 0) 
    { 
     printf("Fib %d is: %d - additions: %d\n", n, rfib(n), g_add); 
    } 
} 

和輸出:

Fib: 10 
Fib 0 is: 0 - additions: 10 
Fib 1 is: 1 - additions: 0 
Fib 2 is: 1 - additions: 0 
Fib 3 is: 2 - additions: 0 (note, the debugger says it is 1) 
Fib 4 is: 3 - additions: 0 
Fib 5 is: 5 - additions: 0 

爲什麼g_add任何想法沒有正確打印?我能做些什麼呢?我嘗試過使用和不使用volatile關鍵字。我認爲這可能與VS環境有關,而不是C++,所以我都標記了兩者。

+1

功能的操作數,即它之前是留給編譯器決定評估的順序。 – AraK 2009-09-01 22:36:22

回答

6

你假設評估參數的順序。

使用這個代替:

int fib = rfib(n); 
printf("Fib %d is: %d - additions: %d\n", n, fib, g_add); 
+0

恰恰是我發佈的答案。 +1 – 2009-09-01 22:33:31

+0

參數從右到左進行評估,除非您使用__stdcall調用約定來聲明函數,據我所知。 – pyon 2009-09-01 22:38:54

+0

@ EduardoLeón:訂單沒有在標準中規定(有意)。因此,編譯器可以按任何順序自由評估它們。另一方面,__stdcall影響ABI,並且只是指定它們被推入堆棧的順序,它對評估順序沒有影響。 – 2009-09-01 22:43:17