2009-09-01 9 views
0

Je joue avec une certaine récursivité et j'essaie de compter le nombre d'additions dans une fonction fib récursive (code ci-dessous). Le problème est que g_add ne s'imprime jamais que par zéro (0). Dans le débogueur, il est correctement défini, mais il ne s'imprimera pas correctement. En fait, le code ci-dessous est modifié un peu, pour vérifier que tout le reste est OK. Dans la vraie vie, g_add est mis à zéro au départ, pas 10 ci-dessous, mais regardez la sortie est l'impression ...La variable globale ne s'imprime pas correctement dans le studio visuel

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); 
    } 
} 

Et la sortie:

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 

Toute réflexion sur les raisons g_add n'est pas imprimé correctement? Et qu'est-ce que je pourrais faire à ce sujet? J'ai essayé avec et sans le mot clé volatile. Je pense que cela pourrait être lié à l'environnement VS, plutôt que C++ donc, j'ai marqué les deux.

+1

Fonction opérandes ordre d'évaluation ne sont pas spécifiés par les normes à-dire qu'il est laissée au compilateur décider de l'ordre d'évaluation. – AraK

Répondre

6

Vous assumez l'ordre dans lequel les paramètres sont évalués.

Utilisez ce lieu:

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

Exactement la réponse que je publiais. +1 –

+0

Les paramètres sont évalués de droite à gauche sauf si vous déclarez la fonction en utilisant la convention d'appel '__stdcall', pour autant que je sache. – pyon

+0

@ Eduardo León: La commande n'est pas spécifiée dans la norme (délibérément). Ainsi, les compilateurs sont libres de les évaluer dans n'importe quel ordre. En revanche, __stdcall affecte l'ABI et spécifie juste l'ordre dans lequel ils sont poussés sur la pile, cela n'a aucun effet sur l'ordre d'évaluation. –

Questions connexes