2009-09-01 16 views
0

私はいくつかの再帰で遊んでおり、再帰的な関数(以下のコード)で追加回数を数えようとしています。問題は、g_addはゼロ以外の何ものでも印刷されないということです。デバッガでは正しく設定されていますが、正しく表示されません。実際には、以下のコードはちょっと修正され、他のすべてがOKであることを健全性のチェックにします。実生活では、g_addは、最初にゼロにではなく、以下の10に設定されているが、出力を見て...グローバル変数がビジュアルスタジオで正しく印刷されない

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上の任意の考えを正しく印刷されていませんか?そして私はそれについて何ができましたか?私は揮発性のキーワードの有無にかかわらず試しました。私はこれがC + +ではなくVS環境に関係していると思うので、私は両方をタグ付けしました。

+1

機能オペランドの評価順序が標準で指定されていない第三引数(rfib(N))の前に(g_add)

  • 四番目の引数を評価しているが、それはコンパイラに任されている、すなわち、評価の順序を決定する。 – AraK

  • 答えて

    6

    パラメータの評価順序を前提としています。

    使用この代わりに:関数のパラメータの評価の

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

    正確に私が投稿した答え。 +1 –

    +0

    私が知る限り、 '__stdcall'呼び出し規約を使って関数を宣言しない限り、パラメータは右から左に評価されます。 – pyon

    +0

    @ EduardoLeón:注文は標準では指定されていません(delibrately)。したがって、コンプライアーは自由に任意の順序で評価することができます。一方、__stdcallはABIに影響を与え、スタックにプッシュされる順序を指定するだけで、評価の順序には影響しません。 –

    関連する問題