理解C++中函式的返回
連續幾年的C++程式設計課教學中,學生中總有人要求為他們單獨解釋函式的返回(return)究竟是什麼意思。各種書中都會詳講返回值的問題,而學生們掌握的難點卻是在返回至何處執行。本文試圖通過對一般函式及遞迴函式
從程式執行的流程角度,返回即是“被呼叫函式執行結束後,返回至呼叫這個函式的位置,接著完成其他任務。”。這句話繞一些,看一些具體的例子。
//例1 #include <iostream> using namespace std; int max(int x, int y); int main() { int a,b,c; a=30; b=20; c=max(a,b); cout<<"大者為: "<<c<<endl; return 0; } int max(int x, int y) { int z; if(x>y) z=x; else z=y; return z; }
在第9行呼叫max(a, b)時,函式會到第14行開始定義的max函式中執行。執行至21行return z時,函式返回至第9行(即“返回至呼叫這個函式的位置”),將返回值賦值給變數c(即“接著完成其他任務”,此處是為c賦值。)
建議初學者在破解這個難關時,利用IDE中提供的單步執行工具實際“走”一遍看看。具體步驟如圖1至圖4。
“返回”,也就是C++中的return,詞典中的釋義是“回到一個地方或狀況或從一個地方或狀況回來的行動”。用現實生活中的例子也可以解釋。例如:
某一天,我要修理一下家裡漏水的水龍頭。關總閥,拆龍頭,修理均順利完成,卻發現後續的安裝無法進行,家裡儲備的密封膠條沒有了,於是吩咐老婆,出去買膠條去。老婆下樓後準備騎自行車去,卻發現車胎沒氣了,於是喊過來正在樓下玩的兒子:“幫娘回家取氣筒去。”兒子回家一趟,返回給他的娘一支氣筒。於是老婆給自行車打了氣,去市場一趟,給我返回了密封膠條,我得以把餘下的安裝、開閥門,清理現場等工作幹完。
圖5說明了這樣一個呼叫、返回的過程。
函式的遞迴是函式“自己呼叫自己”的過程,這讓不少還覺得了解了“返回”含義的同學又遇到了障礙。寫過一個助學文件《讀懂C++遞迴程式》,演示的就是這樣一個呼叫和返回的過程。
以下面以求階乘的遞迴函式為例來說明相關問題。
//例2 #include <iostream> using namespace std; long fact(int); int main( ) { int n; long y; n=5; y=fact(n); cout<<n<<"!="<<y<<endl; return 0; } long fact(int n) { long f; if (n==1) f=1; else f=fact(n-1)*n; return f; }
實際上,遞迴函式返回的意義仍舊。遞迴中的每一次呼叫自身,引數並不一樣。在main函式中第9行執行到y=fact(n)時,呼叫的是fact(5);執行fact(5)時,需要呼叫fact(4),依此一直要呼叫到fact(1),從而不再遞迴呼叫直接得到求解的結果。呼叫一級一級就是這樣下來的,返回則是逆著這個順序展開,fact(1)的返回值1,返回給fact(2)用於計算fact(1)*2,fact(2)的返回值2,返回給fact(3)用於計算fact(2)*3,依此一直返回到fact(5),求出值後遞迴結束,fact(5)的return語句返回到main函式中,最終完成了任務。這個過程如圖6所示。
對於遞迴函式中返回的理解,建議也利用單步執行的方式進行一次跟蹤,從而增加直觀的映像。圖7至圖13展示了這個過程中的幾處關鍵。
再次建議,將除錯工具用好,這是學習程式設計過程中必備的技能。
==================== 迂者 賀利堅 CSDN部落格專欄=================
======== 為IT菜鳥起飛鋪跑道,和學生一起享受快樂和激情的大學 =======