問個遞歸調用的問題
請問下面兩段代碼,為啥是其對應的輸出結果呢?
1、輸出:120(重點想問n--的執行順序,以及為什么這樣)
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語言運算符有優先級和結合性,但是參與運算的操作數的求值順序并沒有規定。所以這兩個代碼是有問題的。
第一個例子中:
return 后面的 n-- 的值肯定是n,但是n自減在這個表達式中是什么時候發生的并不確定(在return語句后肯定減1了,但也沒意義了)
第二個例子:
step的參數--n的值肯定是n-1,而且在函數調用后n的值也肯定是減1了,但是由于操作數的求值順序未定,所以不能保證肯定先調用step函數。
這兩個代碼的行為都是未定義的,能出運算結果不一定代表這就是“正確的”結果。