Expression
運算式 (expression) 由運算元 (operand) 與運算子 (operator) 所組成,最終計算產生一個結果 (result)。
-
Order of Evaluation
想要計算 expression 的話,就必須知道運算子運作及其先後順序。這裡的 * 號就不是 pointer 而是相乘,然後再來是基本的先乘除後加減。
cout << 5 + 10 * 20 / 2 << endl;
cout << 6 + 3 * 4 / 2 + 2 << endl;
cout << (6 + 3) * (4 / 2 + 2) << endl;
cout << ((6 + 3) * 4) / 2 + 2 << endl;
cout << 6 + 3 * 4 / (2 + 2) << endl;
-
Lvalues and Rvalues
有寫過一篇 Lvalues and Rvalues 也可以參考。這裡紀錄此書寫大概的定義,當我們將一個 object 視為 rvalue 使用,使用的是此 object 的值 (contents)。當我們將一個 object 視為 lvalue 使用,使用的是此 object 的「存在」(記憶體位置)。還有一點也很重要,lvalue 可以代替 rvalue,但反之 rvalue 卻不能代替 lvalue。
int a = 1;
int b = a + 1;
int 1 = a;
Operators
-
Logical and Relational Operators
Logical Operators 和 Relational Operators 回傳 bool。Logical Operators AND 跟 OR 永遠都會先計算左側再來計算右側。這裡想特別紀錄的是 && 跟 ||,&& 代表只有左側計算出來是 True 才會計算右側,|| 則是只有左側計算出來是 False 才會計算右側。這可以寫出一些流程控制而不是使用典型的 if else。Relational Operators 則是 >, <, >=, <=, ! 這些。
if (val) { }
if (!val) { }
if (val == true) { }
if (val == 1) { }
-
Assignment Operators
最常見就是等號 (=)。Assignment 是 Right Associative,以下有程式碼示範。另外 Assignment Operators 執行順序較低通常會用括弧輔助。
int ival, jval;
ival = jval = 0;
int i = get_value();
while (i != 42) {
i = get_value();
}
int i;
while ((i = get_value()) != 42) {
}
-
Increment and Decrement Operators
++ -- 用來做 Increment 和 Decrement,兩個都有 prefix 跟 postfix 的寫法,效果如下程式碼示範。要注意的是要盡量用 prefix 來做運算,因為你通常不會需要做增減前的 value,而 postfix 會 copy 一份增減前的 value 來做回傳。
int i = 0, j;
j = ++i;
j = i++;
auto pbeg = v.begin();
while (pbeg != v.end() && *beg >= 0)
cout << *pbeg++ << endl;
Operand 運算順序不是固定的,通常不會造成問題,但如果兩邊有用到同一 variable 且用了 Increment 或 Decrement Operators 問題就會浮現。
auto it = s.begin()
while (it != s.end() && !isspace(*it))
*it = toupper(*it++);
*beg = toupper(*beg);
*(beg + 1) = toupper(*beg);
0 意見:
張貼留言