Please enable JavaScript.
Coggle requires JavaScript to display documents.
Chapter 7 Expressions and Assignment Statements (Mixed-Mode Assignment…
Chapter 7
Expressions and Assignment Statements
算術表達式
設計議題
Operator Precedence Rules (優先權)
說明 : 在相鄰的狀況下,應該先進行哪一個運算?
優先權 : () > 一元 > 次方(**) > 二元 > 乘除 > 加減
Operator Associativity Rule (連結性)
說明 : 鄰近的operator有相同的優先權時,進行運算的順序?
方式
左到右 : 大多數(除了次方以外)
右到左 : APL
Operand Evaluation Order (賦值順序)
變數 : 從memory中取得其值
常數 : 有時從memeory抓,有時則是機器碼中的指令。
括號表達式 : 先替所有的運算元與運算子賦值
函式參考
Functional Side Effects (函式副作用)
定義 : function會改變參數值或全域變數,稱之
如何解決?
方式(2種)
不允許Side Eeffect
缺點 : 不彈性
作法 : 不允許function改變傳入參數的值、存取全域變數
固定運算方向 (e.g. Java)
缺點 : 限制編譯器優化
Referential Transparency
(參考透明度) :兩個表達式可以互換,而不影響結果(p.7-13例子)
缺點 : 可能影響到可讀性
operator overloading (運算子多載)
定義: 運算子具有多種用途 (e.g + 可以用在int, float)
潛在問題
打錯字的話編譯器可能不會發現( & : 代表AND與取址 )
可讀性↓ (C++, Ada允許使用者自訂運算子多載)
mode mixing expressions : 一個表達式中有兩種以上的資料型態
型態轉換
分類(2種)
縮小轉換(可能失真) : float -> int
擴大轉換(不會失真) : int -> float
Mixed Mode
mixed-mode expression
: 表達式中有不同的型態的operand
coercion
: 暗示的型態轉換,減少type checking的好處(可靠度↓,彈性↑)
明示型態轉換
說明 : 在C-based語言中又被稱為
casts
(e.g. C : (int)angle)
問題 : 可能造成run-time error,又被稱為
exceptions
( e.g 除以0、overflow、underflow)
Relational and Boolean Expressions
關係運算式 : 關係運算符 + 各種型態的運算元 -> 產生 Boolean結果
布林運算式 : 布林的運算元 -> 布林的結果
短路求值
定義 : 不用全部算完,就可以得知結果
問題
Non-Short-Circuit Evaluation
index = 1;
while (index <= length) && (LIST[index] != value)
index++;
-> 若無短路求值,index可能超出範圍
Short Circuit Evaluation
(a > b) || (b++ / 3)
b不會每次都被加到
指派語句
表達式
條件目標 ( e.g. flag ? count1 : count2 = 0 )
複合運算子 ( e.g. a = a+b -> a
+=
b )
一元指派運算子( e.g. count++ )
問題 : 可讀性↓, if (x = y)通常無法被偵測到錯誤
圖 p.34 :fire::fire::fire:
Mixed-Mode Assignment
例子
int a = 2, b = 3;
float c;
c = a / b;
C : 允許 mixed-mode assignments,右手邊全部算完後才進行強制轉型
Java, C# : 只允許擴大轉換
Ada : 沒有轉換