# PL Finals ## ch.7 ### Operator associativity rule 規定同優先序的運算子相鄰時,要從左邊 (left-to-right) 或右邊 (right-to-left) 開始計算。 ### Operator precedence rule 規定不同運算子之間的先後計算順序/優先序。 註:括號(parentheses)通常為最高優先級。 ### Referential transparency 兩個具有相同值的表達式 (例如範例中的 result1, result2),任何地方互相替換都不會改變程式的行為,沒有副作用 (functional side effect)。 ```cpp result1 = (fun(a) + b) / (fun(a) - c); temp = fun(a); result2 = (temp + b) / (temp - c); // result1 is equivalent to result2 ``` ### Operator overloading 同一運算子可對不同型別有不同意義。 ### Short Circuit Evaluation 邏輯運算時,前項已決定結果則後項不再計算。 ```cpp int a = 0, b = 1; int expr = (13 * a) * (b / 13 - 1) // a = 0, (b / 13 - 1) is skipped. ``` ### Control structure 用來控制程式執行流程的語句。 ### Selection statement 依條件選擇執行路徑的語句,如 if-else、switch。 ### Unconditional branch 不經條件判斷直接跳到指定位置的指令(goto、return)。 ## ch.9 ### Actual parameter 呼叫函式時真正傳入的值或變數。 ### Formal parameter 副程式標頭中列出的虛擬變數(dummy variable),用來在副程式內部代表、接收實際參數的名稱。 ### Pass-by-Value 傳入值的複本,函式內修改不影響外部。 ### Pass-by-Value-Result 先傳入複本,結束後把結果寫回外部參數。 ### Pass-by-Reference 傳入參數位址,函式修改會影響外部。 ### Pass-by-Name 以「程式碼替換」方式傳入,每次使用時重新求值。 ### Shallow binding 使用函式被呼叫當下的環境(dynamic scope)。 Precisely: 當副程式作為參數傳遞時,其環境綁定於「呼叫該副程式的語句」所在的環境。 ### Deep binding 使用函式建立時的環境(lexical scope)。 Precisely: 當副程式作為參數傳遞時,其環境綁定於「該副程式被定義」時的環境。 ### Polymorphic subprogram 可接受不同型別或多種輸入的副程式。 ```cpp! <template T> ... ``` ### Subtype polymorphism 子類別可被當作父類別使用的多型行為。 ### Closure 函式與其建立當下環境(變數)的組合。 ### Coroutine 一種擁有多個進入點且能自行控制執行的副程式。 與呼叫者是對等關係(Symmetric control),可以反覆地互相讓出控制權並交替執行的程序(暫停和執行) ch. 10 ### Activation record 函式呼叫時在堆疊上的紀錄框架。 ### Dynamic link 指向呼叫者的 activation record。 Precisely: 指向呼叫者(Caller)的啟動紀錄實體(Activation Record Instance)的頂端。 ### Environment Pointer 指向目前 activation record 的指標。 Precisely: 指向當前正在執行的程式單元的啟動紀錄實體的基底(Base) ### Dynamic Chain 由 dynamic link 串成的實際呼叫序列。 ### Local offset 區域變數在 activation record 中的位移位置。 ### Static link 指向外層(封閉 scope)的 activation record。 Precisely: 指向該副程式的靜態父層(Static Parent)的啟動紀錄實體。這是為了實現巢狀作用域。 ### Static chain 由 static link 串成的靜態巢狀結構路徑。 ## ch.11、12 ### Concept of abstraction 將重要特性保留,隱藏複雜細節。 ### Encapsulation 將邏輯上相關的副程式分組,形成一個可以被單獨編譯的單元。 資料與方法包在一起,限制外部直接存取。 ### Dynamic binding 執行時才決定實際要呼叫的方法(多型基礎)。 * 當一個類別階層中包含覆寫(override)的方法,且這些方法是透過一個多型變數(polymorphic variable)來呼叫時,該方法與其定義的繫結將會是「動態」的 。 ### Abstract method 只有宣告、無實作,必須由子類別實作的方法。 * C++ 中稱為「純虛擬函式(pure virtual function)」,它完全沒有定義。 ```cpp virtual void func() = 0; ``` ### Abstract class 不能實例化、只能被繼承的類別,包含至少一個抽象方法(Abstract method)的類別。