Why does post increment operator not work although preincrement does work in this code?

谁都会走 提交于 2019-12-13 03:38:36

问题


I am really new to programming (I'm an electronics and comm. engineer) and I am not able to figure out why one program works and the other one doesn't.

I'd like to get a good understanding of recursive functions before going any further with my learning. I would appreciate any help regarding this.

I know the difference between the x++ and --x. But in this context of this program, I thought both of these programs should run the same way. But they don't.

void rec(int x)
{
    if(x>0)
        rec(x--);
    printf("%d",x);
}

int main()
{
    rec(4);
    _getch();

} /*This doesn't work. And shows a stackoverflow */

void rec(int x)
{
    if(x>0)
        rec(--x);
    printf("%d",x);
}

int main()
{
    rec(4);
    _getch();

} /*This gives a proper output as expected*/ 
/*The output is 00123*/

Thanks!

P.S: Forgive me if this is a trivial or stupid question, but I am stuck on this and I thought this is the best place I can look for help.


回答1:


void rec(int x) {
    if (x>0)
        rec(x--);
    printf("%d",x);
}

This will recurse forever (or at least until you exhaust your stack space). x-- means use the current value of xand then decrement it.

In other words, let's call rec with the parameter 20. That's greater than zero, so it will in turn call rec again with the current value of 20 then decrement x (but effectively after the call returns.

Hence you're forever calling rec with the value of 20, which is why you're blowing out your stack.

If you change x-- to --x, it decrements x before passing it to the function, hence it will go 20, 19, 18, ... 1, 0, at which point it will run back up the stack printing all those values.

If you had put a printf ("before: %d\n", x) before the if statement, you would have seen a lot of 20 lines output to the screen.




回答2:


x-- calls the function with the old value of x (before decrement). So you will get an infinite recursion of it calling itself with the same value. --x calls the function with the new (decremented)) value of x, so it eventually hits the x > 0 condition.

Another way to investigate this is to do the following:

int a, b;
a = b = 1;

printf("--a: %d b--: %d\n", --a, b--); // Output is --a: 0 b--: 1


来源:https://stackoverflow.com/questions/12667859/why-does-post-increment-operator-not-work-although-preincrement-does-work-in-thi

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!