--- tags: C++教學筆記 --- # 運算子與運算式 ## 運算式簡介 運算式是由運算子(operand)與運算子(operator)組成的,例如下面的`sum`與`i`為運算元,`+`與`=`為運算子。 `sum = sum + i;` ### 一元運算子(unary operator) 包含 `+`(正號) 、`-`(負號) 、`++` 、`--` 、`=` ### 二元運算子(binary operator) 包含 算術運算子 、位元運算子等等 ### 三元運算子(ternary operator) 僅有 條件運算子`?` 一種 ## 常見運算子 | 分類 | 運算子 | 功能 | | -------- | -------- | -------- | | 指定運算子 | `=` | 將右值指定至左側變數 | | 算數運算子 | `+` `-` `*` `/` | 即為數學上的運算符號 | | 算數運算子 | `%` | 取餘數 | | 位元運算子 | `>>` `<<` `&` `\|` `~` `^` | 做位元運算使用 | | 複合指定運算子 | `+=` `-=` `*=` `/=` `%=` $\ \cdots$ | | | 遞增/遞減運算子 | `++` `--` | | | 關係運算子 | `==` `!=` `>` `<` `>=` `<=` | 比較兩變數關係使用 | | 邏輯運算子 | `&&` `\|\|` `!` | 且、或、非 等邏輯判斷 | | 條件運算子 | `?` | | | 逗號運算子 | `,` | 分隔敘述使用 | | 資料大小運算子 | `sizeof` | 取得資料大小 | | 位址運算子 | `&` | 取址使用 | --- ## 複合指定運算子 | 複合指定運算子 | 一般運算子 | | -------- | -------- | | `i += j` | `i = i + j` | | `i -= j` | `i = i - j` | | `i *= j` | `i = i * j` | | `i /= j` | `i = i / j` | | `i %= j` | `i = i % j` | | `i >>= j` | `i = i >> j` | | `i <<= j` | `i = i << j` | | `i ^= j` | `i = i ^ j` | | `i &= j` | `i = i & j` | | `i \|= j` | `i = i \| j` | --- ## 遞增/遞減運算子 遞增運算子 `a++` 即為 `a += 1` 的簡寫。 遞減運算子 `a--` 即為 `a -= 1` 的簡寫。 這兩種運算子皆有前置 `++a` 及後置 `a++` 的寫法, 前置與後置的區別在遞增(減)相較於其他行為的順序, 以下列程式碼為例: ```cpp int a = 10; cout << "Test #1: "; cout << a << ' '; cout << a++ << ' '; cout << a << endl; a = 10; cout << "Test #2: "; cout << a << ' '; cout << ++a << ' '; cout << a << endl; ``` 輸出為: ``` Test #1: 10 10 11 Test #2: 10 11 11 ``` --- ## 條件式 條件式泛指所有可以傳出 `true` 或 `false` 結果的運算式, 例如 `a > b` 、`a == b` 等等。 除了可以用`a > b`外,也可以結合邏輯運算子`&&` `||` `!`等, 例如:`a > b && b <= 10` 、`a != b` 等等。 而在C++中,所有非 `0` 的值皆是 `true`,`0` 代表 `false`。 因此,變數、`a % 2` 等等也可以作為運算式。 詳細用法請參閱 [**選擇結構篇**](https://hackmd.io/@HAHAHAHAHA/selection/) 。 --- ## 條件運算子 用法: `邏輯條件式 ? 是true的值 : 是false的值` 例子: * **給值** ```cpp int a = (10 > 5 ? 10 : 5); cout << a << endl; ``` 結果: `10` * **輸出** ```cpp int a, b; cin >> a >> b; cout << (a > b ? "a比較大" : "b比較大") << endl; ``` 輸入: `5 10` 輸出: `b比較大` > 這一個例子的邏輯有小問題,可以思考看看問題出現在哪裡,也可以嘗試去解決。 * **判斷奇偶數** ```cpp int a; cin >> a; cout << a << (a % 2 ? "是奇數" : "是偶數") << endl; ``` 比較帥的寫法: ```cpp int a; cin >> a; cout << a << (a & 1 ? "是奇數" : "是偶數") << endl; ``` 輸入: `5 10` 輸出: ``` 5是奇數 10是偶數 ``` --- ## 強制轉型 強制轉型是利用`()`運算子來強制轉換變數的型態。 用法: `(型態) 變數` 或 `型態 (變數)` 下方給一個簡單的例子: ```cpp int a = 3, b=2; cout << (float)a/b << \n; ``` 上述程式碼因為`a` `b`皆為整數型別,但相除時,若不強制轉換成浮點數,編譯器會認為運算結果也會是整數,所以需要在變數前強制轉型,才會正確顯示出`1.5`。 除了上述的強制轉型外,也可以把數字強制轉型為字元,字元部分會依照ASCII編碼轉換。