【文章內(nèi)容簡(jiǎn)介】
{ int a = 2。 printf(“%d %d\n”, a, b)。 } { int b = 3。 printf(“%d %d\n”, a, b)。 } printf(“%d %d\n”, a, b)。 } printf(“%d %d\n”, a, b)。 } B0 B1 B2 B3 聲明 作用域 int a = 0。 B0B2 int b = 0。 B0B1 int b = 1。 B1B3 int a = 2。 B2 int b = 3。 B3 運(yùn)行結(jié)果 2 1 0 3 0 1 0 0 實(shí)現(xiàn)方法 ?棧實(shí)現(xiàn),將塊看作過(guò)程 ?過(guò)程內(nèi)實(shí)現(xiàn) 無(wú)過(guò)程嵌套的靜態(tài)作用域 ?C ?局部名字 ——棧 ?任何過(guò)程之外的名字 ——靜態(tài)分配 ?非局部 ——全局概念 ?過(guò)程可作為參數(shù)和返回值 ?非局部名字都可用靜態(tài)地址訪問(wèn)到 過(guò)程作為參數(shù) ——無(wú)嵌套情況 program pass(input, output)。 var m : integer。 function f(n : integer) : integer。 begin f := m + n end。 function g(n : integer) : integer。 begin g := m * n end。 procedure b(function h(n : integer) : integer)。 begin write(h(2)) end。 begin m := 0。 b(f)。 b(g)。 writeln end. 運(yùn)行結(jié)果: 2 0 包含過(guò)程嵌套的靜態(tài)作用域 ?Pascal,最近嵌套規(guī)則 program sort(input, output)。 var a : array[0..10] of integer。 x : integer。 procedure readarray。 var i : integer。 begin … a … end {readarray}。 procedure exchange(i, j : integer)。 begin x:=a[i]。a[i]:=a[j]。a[j]:=x end {exchange}。 procedure quicksort(m, n : integer)。 var k, v : integer。 function partition(y, z : integer) : integer。 var i, j : integer。 begin …a… …v… end {partition}。 begin … end {quicksort}。 begin … end {sort}. 嵌套深度( nesting depth) sort 1 readarray 2 exchange 2 quicksort 2 partition 3 訪問(wèn)鏈接 ?p直接嵌套在 q內(nèi) ?p的訪問(wèn)鏈接指向 q的最近一次活動(dòng)記錄內(nèi)的訪問(wèn)鏈接 使用訪問(wèn)鏈接 ? 過(guò)程 p(嵌套深度 np)訪問(wèn)非局部數(shù)據(jù) a(嵌套深度 na), na=np,訪問(wèn)方法為: 1. 當(dāng)控制流到達(dá) p,其活動(dòng)記錄位于棧頂。從它的訪問(wèn)鏈接開(kāi)始,遍歷 npna(此值在編譯階段即可獲得)個(gè)訪問(wèn)鏈接 2. 此時(shí)即可到達(dá) a所在過(guò)程的活動(dòng)記錄,由其訪問(wèn)鏈接地址即可得到 a的地址 設(shè)置訪問(wèn)鏈接 ? 調(diào)用序列代碼的一部分,假定過(guò)程 p(嵌套深度 np)調(diào)用過(guò)程 x(嵌套深度 nx) 1. npnx ?x在 p內(nèi)部聲明,應(yīng)將 x的訪問(wèn)鏈接指向 p的訪問(wèn)鏈接 2. np=nx ?當(dāng)前包含 p和 x,深度為 1, 2, …, n x1的過(guò)程必然是相同 從 p開(kāi)始,遍歷 npnx+1個(gè)訪問(wèn)鏈接,到達(dá)同時(shí)包含 p、 x的最近的過(guò)程的活動(dòng)記錄 x的訪問(wèn)鏈接應(yīng)指向此記錄的訪問(wèn)鏈接 過(guò)程作為參數(shù)的情況 program param(input, output)。 procedure b(function h(n : integer) : integer)。 begin writeln(h(2)) end { b }。 procedure c。 var m : integer。 function f(n : integer) : integer。 begin f := m + n end { f }。 begin m := 0。 b(f) end { c }。 begin c end. 過(guò)程作為參數(shù)的情況(續(xù)) ?當(dāng)過(guò)程作為參數(shù)傳遞時(shí),對(duì)應(yīng)的訪問(wèn)鏈接也一起傳遞 Display表 ?一維數(shù)組 d[i]:將嵌套深度為 i的過(guò)程的訪問(wèn)鏈接串起來(lái) Display表(續(xù)) display表的設(shè)置 ?當(dāng)設(shè)置嵌套深度為 i的過(guò)程的活動(dòng)記錄 ?舊的 d[i]值保存入新的活動(dòng)記錄 ?設(shè)置 d[i]指向新的活動(dòng)記錄 ?正確性:假定嵌套深度 j的過(guò)程調(diào)用深度 i的過(guò)程 ? ji: ?i=j+1, d[1]~d[j]無(wú)需改變, d[i]指向新活動(dòng)記錄,上面 (a)圖 ? j=i: ?包含兩個(gè)過(guò)程,嵌套深度 1,2,…,i 1的過(guò)程必然是相同的,將舊 d[i]保存到新活動(dòng)記錄,并設(shè)置它指向新活動(dòng)記錄即可,上面 (d)圖 動(dòng)態(tài)作用域 ?嵌套關(guān)系,調(diào)用關(guān)系 決定名字綁定 program dynamic(input, output)。 var r : real。 procedure show。 begin write(r : 5 : 3) end。 procedure small。 var r : real。 begin r := 。 show end。 begin r := 。 show。 small。 writeln。 show。 small。 wr