1. 程式人生 > >理解C++中函式的返回

理解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函式中執行。執行至21return 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)*2fact(2)的返回值2,返回給fact(3)用於計算fact(2)*3,依此一直返回到fact(5),求出值後遞迴結束,fact(5)return語句返回到main函式中,最終完成了任務。這個過程如圖6所示。


  對於遞迴函式中返回的理解,建議也利用單步執行的方式進行一次跟蹤,從而增加直觀的映像。圖7至圖13展示了這個過程中的幾處關鍵。

 

  再次建議,將除錯工具用好,這是學習程式設計過程中必備的技能。

==================== 迂者 賀利堅 CSDN部落格專欄=================

======== 為IT菜鳥起飛鋪跑道,和學生一起享受快樂和激情的大學 =======