为什么--x; work和x--给出了递归代码中的seg错误

cam*_*man 3 c recursion segmentation-fault

这段代码给了我一个seg错误,但当我改变它时x--,--x它打印正确.

他们不一样????

int main()
{    
    myFunc(5); 
    return 0;
}

void myFunc (int x) {  
    if (x > 0) {
        myFunc(x--);
        printf("%d, ", x);
    }
    else
        return;
}
Run Code Online (Sandbox Code Playgroud)

Mys*_*ial 13

不,他们不一样.

x--和之间的区别在于--x返回值是在减量之前还是之后.

myFunc(x--),x--返回旧值.所以myFunc()称为可重复性具有相同的值 - >无限递归.

myFunc(--x),--x返回新值.因此myFunc()每次调用的次数减少 - >无无限递归.


如果你移动printf到函数调用的开头会更容易看到这个:

void myFunc (int x) {  
    printf("%d, ", x);

    if (x > 0) {
        myFunc(x--);

    }
    else
        return;
}
Run Code Online (Sandbox Code Playgroud)

输出:(用10调用时)

10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, ...
Run Code Online (Sandbox Code Playgroud)


Way*_*ett 5

后递减操作(x--)求值参数发生,因此myFunc使用相同的值重复调用.pre-decrement(--x)操作评估参数之前发生,它按预期工作.