[英]Where does the argument go when passed to a function having no declaration for parameters
[英]Recursive function, where the argument is passed in the different ways
有人可以向我解釋這三個代碼塊之間的區別嗎?
#include <stdio.h>
void f(int a)
{
printf("%d", a);
if (a >= 1)
f(--a);
printf("%d", a);
}
int main()
{
f(3);
return 0;
}
Output:32100012
#include <stdio.h>
void f(int a)
{
printf("%d", a);
if (a >= 1)
f(a - 1);
printf("%d", a);
}
int main()
{
f(3);
return 0;
}
Output:32100123
#include <stdio.h>
void f(int a)
{
printf("%d", a);
if (a >= 1)
f(a--);
printf("%d", a);
}
int main()
{
f(3);
return 0;
}
Output:無限打印數字3
1) printf("%d", a); if (a >= 1) f(--a); printf("%d", a);
^^^^^^^^^^^^^^^^ ******************* ^^^^^^^^^^^^^^^^
*********** f(2) **
打印兩次,中間a
一些東西; 某事包括遞減a
。 所以f(3)
打印3<something_recursive_from_f(2)>2
2) printf("%d", a); if (a >= 1) f(a - 1); printf("%d", a);
^^^^^^^^^^^^^^^^ ********************* ^^^^^^^^^^^^^^^^
*********** f(2) ****
打印兩次,中間a
一些東西。 所以f(3)
打印3<something_recursive_from_f(2)>3
3) printf("%d", a); if (a >= 1) f(a--); printf("%d", a);
^^^^^^^^^^^^^^^^ ******************* ^^^^^^^^^^^^^^^^
*********** f(3) **
打印兩次,中間a
一些東西; 某事包括遞減a
。 所以f(3)
打印3<something_recursive_from_f(3)>2
...但遞歸的東西又是f(3)
......又是 f(3 f(3)
......又是f(3)
......直到你的電腦燒壞了。
第三個f(a--);
它總是用a == 3
調用f
,然后(在 function 返回之后)它將從a
中減去1
。 但永遠不會發生。
第二個 - 它只是用a minus 1
調用f
,但不將a
打印所有內容從 3 更改為 0,然后當 function 返回第二個打印時,它以相反的順序打印,因為函數在 FIFO 基礎上返回。
第一個與第二個基本非常相似,但a
遞減,因此第二個printf
打印的結果是0012
而不是0123
一些視覺輔助。
考慮第一個代碼示例中發生的情況:
f(3)
-> prints "3"
-> decrements a to 2
-> calls f(2)
-> prints "2"
-> decrements a to 1
-> calls f(1)
-> prints "1"
-> decrements a to 0
-> calls f(0)
-> prints "0"
-> prints "0"
-> prints "0"
-> prints "1"
-> prints "2"
使用第二個代碼示例:
f(3)
-> prints "3"
-> calls f(2)
-> prints "2"
-> calls f(1)
-> prints "1"
-> calls f(0)
-> prints "0"
-> prints "0"
-> prints "1"
-> prints "2"
-> prints "3"
第三個示例代碼:
f(3)
-> prints "3"
-> *post*-decrements a to 2
-> calls f(3)
-> prints "3"
-> *post*-decrements a to 2
-> calls f(3)
-> Oops! Infinite loop.
閱讀前后遞增和遞減運算符之間的區別。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.