2014-02-01 2 views
-4
#include <iostream.h> 

int someFunction(int &x, int c) { 
    c=c-1; 
    if(c==0) { 
     return 1; 
    } 
    x=x+1; 
    return someFunction(x,c) * x; 
} 

void main() { 
    int p = 5; 
    cout << someFunction(p,p); 
} 

Этот код возвращает 6561, но я понятия не имею, почему. Кто-нибудь может мне с этим помочь?Неожиданное возвращаемое значение определенной пользователем функции

+2

Вы запустили код с помощью отладки э? –

+2

1) ''. 2) 'int main()'. 3) 'std :: cout'. Все это необходимые изменения, чтобы сделать ваш код стандартным C++. – chris

ответ

0

У вас есть 5 итераций здесь:

1st iteration - C is 5 and reduced by 1 -> c=4 which is not 0 so we go on to "(++x) * someFunc". 
2nd iteration - C is 4 and reduced by 1 -> c=3 which is not 0 so we go on to "(++x) * someFunc". 
3rd iteration - C is 3 and reduced by 1 -> c=2 which is not 0 so we go on to "(++x) * someFunc". 
4th iteration - C is 2 and reduced by 1 -> c=1 which is not 0 so we go on to "(++x) * someFunc". 
5th iteration - C is 1 and reduced by 1 -> c=0 so we return 1. 

На данный момент мы имеем х * х * х * х * 1 и после того, как с шагом 4 х = 9 и поэтому значение 9 * 9 * 9 * 9 * 1 = 6561

Это происходит потому, что функция вычисляется до того, как фактическое умножение может иметь место, но по мере того, как стек разматывается, в момент каждого умножения x, который передается по ссылке, уже находится в последнем значении, которое is 9.

+0

Я уверен, что 'x' может быть оценен как 6, 7 или 8 перед вызовом функции и изменяет его (поскольку порядок оценки неуточнен). Действительно, выполнение 'x * someFunction (x, c)' дает [другой результат] (http://coliru.stacked-crooked.com/a/aec2aff7c7da47ff). – chris

+0

@chris Это зависит от компилятора, я полагаю, но разумный компилятор выполнил бы разыменование адреса после рекурсивного вызова 'someFunc' и, следовательно, установил обновленное значение в регистр, используемый для умножения. Конечно, разные оптимизации могут генерировать разные результаты. Тем не менее это поведение объясняет значение, полученное в вопросе – immortal

Смежные вопросы