問個(gè)遞歸調(diào)用的問題
請問下面兩段代碼,為啥是其對應(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)先級和結(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é)果。