问题
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 x
and 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