C的这种行为如何解释?

inf*_*oop 2 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));
Run Code Online (Sandbox Code Playgroud)

代码B.

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

int main() { printf("%d\n", foo(10));
Run Code Online (Sandbox Code Playgroud)

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

另一方面,代码B卡住了,永远不会返回提示!我必须这样ctrl+c做.为什么会卡住?是因为它从未减少到10岁?

Bla*_*ear 9

那是因为在片段中,在递归调用之后,B x会递减,因此总是使用foo调用该函数(10)

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