c - C 的这种行为是如何解释的?

标签 c recursion decrement

所以我在 C 中玩递归,我不确定为什么会这样:
代码A

int foo(int x)
{
 if (x==0) return 0;
 else return foo(--x)+x;
}

int main() { printf("%d\n", foo(10));

代码 B

int foo(int x)
{
 if (x==0) return 0;
 else return foo(x--)+x;
}

int main() { printf("%d\n", foo(10));

代码 A 打印 45 而不是 55,我想通了。这是因为递归调用以这种方式解除:9+8+7+...+0 = 45

另一方面,代码 B 卡住了,永远不会返回提示!我必须 ctrl+c 它。为什么会卡住?是因为它永远不会减少超过 10 吗?

最佳答案

那是因为在代码段 B 中,x 在递归调用后 递减,所以函数总是用 foo(10) 调用

编辑:
正如 James McNellis 在其评论中指出的那样,x 在调用函数之前会递减,但它的原始值在调用中使用,而不是递减后的值。
基本上表达式 x-- 在 foo(x--) 之前求值,但它的值实际上是 x,因此调用函数时 x = 10

关于c - C 的这种行为是如何解释的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12063323/

相关文章:

c - 如何避免访问已释放的地址?

python - 在递归循环中附加到列表

c - 将数据动态复制到二维字符数组时发生访问冲突

html - 递减有序列表

search - 增加和减少数字

c - 解释以下C程序的输出

C:通过 argv[] 将文件名加载到结构中,但我不想要文件类型(例如 .txt)?

字母字符的字符到整数转换关闭

c - 比较文件中相邻行的更好算法

java - 如何在使用递归时增加 3 个不同路径的数字?