Код 1
#include <stdio.h>
int f(int *a, int b)
{
b = b - 1;
if(b == 0) return 1;
else {
*a = *a+1;
return *a + f(a, b);
}
}
int main() {
int X = 5;
printf("%d\n",f(&X, X));
}
Рассмотрим этот код. Вопрос здесь - предсказать выход. По логике, я получаю 31 как вывод. (Выход на машине)
Когда я меняю оператор return на
return f(a, b) + *a;
Я логически получаю 37. (Выход на машине)
Один из моих друзей сказал, что при вычислении выражения return в
return *a + f(a, b);
мы вычисляем значение a, идя глубина дерева, т.е. вызывается первый вычисленный тогда f(a, b)
, тогда как в
return f(a,b) + *a;
Он решается при возврате назад, т.е. f(a, b)
вычисляется сначала, тогда вызывается *a
.
При таком подходе я попытался предсказать вывод следующего кода:
Код 2
#include <stdio.h>
int foo(int n)
{
static int r;
if(n <= 1)
return 1;
r = n + r;
return r + foo(n - 2);
}
int main () {
printf("value : %d",foo(5));
}
Для return(r+foo(n-2));
Im получает 14 как вывод логически (Выход на машине)
Для return(foo(n-2)+r);
Я получаю 17 в качестве вывода. (Выход на машине)
Однако, когда я запускаю код в своей системе, я получаю 17 в обоих случаях.
Мои вопросы:
- Правилен ли мой подход?
- Если да, то почему я получаю тот же результат в Code 2, когда я запускаю на машине?
- Если нет, то какой правильный способ интерпретировать Код 1 и Код 2?
- Есть ли какое-либо поведение undefined, потому что C не поддерживает pass by Reference? Поскольку он используется в Code 1, он может быть реализован с помощью указателей?
В двух словах я просто хотел знать правильный способ предсказать вывод в 4 случаях, упомянутых выше.