問個(gè)遞歸調(diào)用的問題
請(qǐng)問下面兩段代碼,為啥是其對(duì)應(yīng)的輸出結(jié)果呢?
1、輸出:120(重點(diǎn)想問n--的執(zhí)行順序,以及為什么這樣)
int?step(int?n)
{
????if?(n?>?1)?{
????????return?n--?*?step(n);
????}?else?{
????????return?1;
????}
}
int?main(int?argc,?char*?argv[])
{
????int?a?=?step(5);
????printf("%d",?a);
????return?0;
}2、輸出:24
int?step(int?n)
{
????if?(n?>?1)?{
????????return?n?*?step(--n);
????}?else?{
????????return?1;
????}
}
int?main(int?argc,?char*?argv[])
{
????int?a?=?step(5);
????printf("%d",?a);
????return?0;
}
2015-08-05
C語言運(yùn)算符有優(yōu)先級(jí)和結(jié)合性,但是參與運(yùn)算的操作數(shù)的求值順序并沒有規(guī)定。所以這兩個(gè)代碼是有問題的。
第一個(gè)例子中:
return 后面的 n-- 的值肯定是n,但是n自減在這個(gè)表達(dá)式中是什么時(shí)候發(fā)生的并不確定(在return語句后肯定減1了,但也沒意義了)
第二個(gè)例子:
step的參數(shù)--n的值肯定是n-1,而且在函數(shù)調(diào)用后n的值也肯定是減1了,但是由于操作數(shù)的求值順序未定,所以不能保證肯定先調(diào)用step函數(shù)。
這兩個(gè)代碼的行為都是未定義的,能出運(yùn)算結(jié)果不一定代表這就是“正確的”結(jié)果。