產生巢狀函式先呼叫的後結束的原因

2021-09-29 19:38:59 字數 951 閱讀 1599

public

class

testdemo5

public

static

voidm1(

)public

static

voidm2(

)}輸出結果:

main開始

m1開始

m2開始

m2結束

m1結束

main結束

先執行主函式,輸出main函式開始,緊接著在主函式裡呼叫了m1()方法,進入m1方法體,執行system.out.println(「m1開始」);語句,輸出m1開始,然後呼叫了m2()函式,進入m2函式體,輸出 m2開始 和 m2結束,此時函式已經全部呼叫完畢,返回主函式體,執行呼叫m1()方法後的**塊,輸出了main函式結束。到此,程式執行完畢,產生結果:

main開始

m1開始

m2開始

m2結束

m1結束

main結束

表面上是函式沒執行完而不會進行向下執行,所以造成了巢狀函式呼叫時先呼叫後結束的結果。

在程式的執行過程中,主函式作為程式的入口,先先從主函式開始執行,jvm會呼叫main函式,生成乙個main函式的棧幀,存放在jvm棧中的最下邊,然後由main函式呼叫了m1函式,m1生成乙個m1函式的棧幀,存放在jvm棧中,在main函式棧幀之上,而後又由m1呼叫m2,m2函式生成了m2函式的棧幀,存放在jvm棧中m1棧幀之上。

此時jvm棧中從上到下分別存放著m2棧幀、m1棧幀、main函式棧幀。我們知道,棧是先進後出,所以先出棧的是m2棧幀,而後是m1棧幀,最後乙個是main函式棧幀,因此,m2函式先執行完,而後是m1函式,最後是主函式。

至此,我們可以明白為何巢狀函式先呼叫後結束。

程式結束後呼叫的函式 註冊終止函式

相關函式 exit,atexit,exit 註冊終止函式 1,on exit 標頭檔案 include 定義函式 int on exit void function int void void arg 函式說明 on exit 用來設定乙個程式正常結束前呼叫的函式.當程式通過呼叫exit 或從mai...

PHP函式的巢狀呼叫

一 php xmlns php function example price tax total price price tax echo 是 total 美元 echo 是 examples total 元 example 15.00 0.75 二 執行結果 是 26.25 美元 是 196.87...

函式的巢狀呼叫和遞迴呼叫

巢狀呼叫 在定義函式時,乙個函式內不能再定義另乙個函式,即不能巢狀定義,但可以巢狀呼叫函式,即在呼叫乙個函式的過程中,又呼叫另乙個函式。執行過程 1,執行main函式的開頭部分 2,遇函式呼叫語句,呼叫函式a,流程轉去a函式 3,執行a函式的開頭部分 4,遇函式呼叫語句,呼叫函式b,流程轉去函式b ...