【发布时间】:2021-09-11 14:40:34
【问题描述】:
我遇到了以下问题:
#include <stdio.h>
int f(int &x, int c)
{
c = c - 1;
if (c == 0) return 1;
x = x + 1;
return f(x, c) * x;
}
int main()
{
int p = 5;
printf("%d", f(p, p));
}
据我所知,递归调用应该可以工作,并且每次递归调用时, c 的值应该减少 1 , x 的值应该增加 1 。但是,如果我这样计算,结果是 3024。但是,在执行时,输出结果是 6561。我不确定这个答案是怎么来的。
我有指向提出这个问题的文章的链接,但我不明白 x 将如何保持不变,如以下链接所述:https://www.geeksforgeeks.org/c-references-question-1/
有人可以帮我处理这段代码背后的工作吗?
【问题讨论】:
-
尝试使用调试器单步执行,或添加输出语句 (ideone.com/uoO3Ak) 以观察每个递归函数调用的
c和x的值。 -
返回值不取决于
f(x, c)还是x在return f(x, c) * x中首先被评估? -
这是未定义的行为,因为
x在乘法的一个操作数中被修改并在另一个操作数中读取。 -
这个问题之前stackoverflow.com/questions/38933101/…已经回答过
-
@MathiasJ 从计算隐式括号的位置而言,这是运算符优先级,它不会告诉您操作数的求值顺序。
标签: c++ recursion reference pass-by-reference