2017-03-18 1 views
1

J'ai trouvé que le paramètre I retourné est différent dans la fonction externe quand il est appelé que dans la fonction locale. Je mets un peu l'impression dans chaque section du code, mais ne sait toujours pas pourquoi le paramètre i n'est pas retourné:C++ retour à un résultat différent

int assign_cookie(vector<int>& g, vector<int>& s){ 

if(s.size()==0 || g.size()==0){ 
     cout << "size = 0, returning 0" << endl; 
     return 0; 
    } 

cout << "s.size() = " << s.size() << endl; 
cout << "g.size() = " << g.size() << endl; 

sort(g.begin(), g.end()); 
sort(s.begin(), s.end()); 

unsigned int i, j = 0; 
while(i<g.size() && j<s.size()){ 
    if(g[i]<=s[j]) i++; 
    j++; 
} 
cout << "(assign_cookie) i = " << i << endl; 
return i; 

} 

quand je l'ai appelé dans la fonction principale comme suit:

int main(){ 

int g[] = {1,2,3}; 
int s[] = {1,1}; 

vector<int> vg (g, g+3); 
vector<int> vs (s, s+2); 

int result = assign_cookie(vg,vs); 
cout << "result = " << result << endl; 
} 

I obtenu les résultats comme suit:

s.size() = 2 
g.size() = 3 
(assign_cookie) i = 1 
(main) result = 0 

J'ai été très confus avec le résultat. Quelqu'un a une idée de ce qui se passe? Merci d'avance pour votre aide!

Répondre

1

Vous avez un comportement non défini, car ici

unsigned int i,j=0; 

vous n'initialisez j mais pas i puis vous utilisez i comme index dans g[i] sans jamais lui attribuer une valeur significative. Donc c'est UB et tout peut arriver. En fait, c'est un cas intéressant de UB, comme lorsque vous faites

unsigned int i,j=0; 
std::cout << "i = " << i << "\n"; 

il imprime encore

i = 0 
(assign_cookie) i = 1 
result = 0 

see also here. Même si le compilateur semble initialiser i à 0 il se rend toujours compte qu'il y a UB et prend la liberté de produire des déchets.