C++筆記-邏輯與運算子
表達式 Expression
有人常言道:「表達式(計算式)的天職,就是得到一個值。」
1 + 2
是一個表達式,其中 1
是一個運算元,2
是另一個運算元,而 +
是運算子。
1 + ( 2 - 3 )
也是一個表達式,這個表達式裡還有一個表達式 ( 2 - 3 )
,稱為複合表達式(Compound Expression)
而等等會看到的 a = 5
,其實也是一個表達式,將 5
賦值給 a
,那麼這個表達式得到的值當然就是最後賦值給 a
的數值。
運算子 Operator
運算子可簡單區分為一元(單元)運算子、二元運算子以及三元運算子。
每個運算子都有執行的優先順序,如同數學有先乘除後加減,以下是之後可能會在 c++ 看到的運算子:
優先度 | 運算子 | 描述 | 閱讀順序 | 例子 |
---|---|---|---|---|
1 | :: | 作用域 | -> | std::cout « endl; |
2 | ++/-- () [] . -> | 先回傳再加減1 \ 函式呼叫 \ 陣列存取 \ 物件存取成員 \ 指標存取成員 | -> | i++/i--; int a = f(x); int a[10]; obj.cmp = 0; ptr->val = 0; |
3 | ++/-- +/- ! ~ (Type) * & sizeof | 先加/減1再回傳 \ 正負號 \ 邏輯NOT \ 位元取反 \ 強轉類型 \ 指標取值 \ 取址 \ 佔用位元組大小 | <- | ++i/--i +/-1 if(!true) a = ~a; int i=int(doublex); int k = *a; int *k = &a; cout « sizeof(int);//4 |
4 | * / % | 乘 \ 除 \ 取模 | -> | int a = 8*8; int a = 20/6; int a = 6%4; |
5 | +/- | 加 \ 減 | -> | int a = 6+4; |
6 | »/« | 位元右 \ 左移 | -> | int a = 4 » 3; |
7 | </<=/>/>= | 大小等於 | -> | if(a < 0) |
8 | ==/!= | 等於/不等於 | -> | while(a!=0) |
9 | & | 位元AND運算 | -> | n = x&1 |
10 | ^ | 位元XOR運算 | -> | n = x^1 |
11 | | | 位元OR運算 | -> | n = x|1 |
12 | && | 邏輯AND | -> | if(1==3 && 2==2) |
13 | || | 邏輯OR | -> | if(1==3 || 2==2) |
14 | c?p1:p2 | 三元條件運算(可當成if-else) | <- | int i = a>b?a:b; |
15 | =/+=/-=/*=//=/%=/«=/»=/&=/^=/|= | 賦值 | <- | a+=3;b&=1; |
16 | , | 逗號 | -> | int i,j,k; |
賦值運算子 Assignment operator
用於修改容器所存的值,比如 =
,而 a = 5
這個表達式中,就是將數字 5
賦值給 a
。
算術運算子 Arithmetic operator
五則運算
在 C++ 中,除了我們熟知的加 +
減 -
乘 *
除 /
,還多了一個模運算 %
,或稱取餘運算,也就是做除法後,看餘數是多少。
比較運算子
用於比較運算元的關係,如大於 >
、小於 <
、相等 ==
以及不等 !=
,
要特別注意的是,相等是兩個等號 ==
,一個等號 =
的是賦值的意思而不是相等。
位元運算子
位元運算AND、OR、XOR,
它們的運算方式都要從二進位表示法來看,
並一個一個位數來做計算。
使用AND運算結果如下:
P | Q | 結果 |
---|---|---|
0 | 0 | 0 |
1 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
舉例:
$9_{10}\ \&\ 8_{10}= 1001_2\ \&\ 1000_2=1000_2=8_{10}$
可觀察只有當兩位元都是1時輸出才是1。
我們可以將它應用在判斷奇偶數:
|
|
使用OR運算結果如下:
P | Q | 結果 |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 1 |
舉例:
$ 10_{10}\ |\ 8_{10} = 1010_2\ |\ 1000_2 = 1010_2 = 10_{10} $$
只要有位元為1,則輸出就是1。
使用XOR運算結果如下:
P | Q | 結果 |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
舉例:
$ 10_{10} \oplus 8_{10} = 1010_2 \oplus 1000_2 = 0010_2 = 2_{10} $
兩個位元只能有一個是1,其他情況都回傳0。
它的用途更廣,你可以用它將兩個數交換:
|
|
可以判別一個陣列中哪個數缺少:
|
|
可以做大小寫轉換:
|
|
另外再介紹位元左右移,就是將數寫成二進位後乘十或除十,相當於十進位中乘二或除二。
|
|
陳述式 Statement
在 C++ 裡使用 Statement 表示完整的操作,其中大部分陳述式會以分號 ;
結尾,
有些 Statement 裡還會包含另一個 Statement。
int a = 0;
這是一個完整的程式陳述句
int b = a;
這也是一個完整的程式陳述句
c = a + b;
這也是一個完整的程式陳述句
問題來了:
|
|
5;
是不是一個 Statement 呢?
複合陳述式 Compound Statement
又稱為 區塊 block,由一些小的 statement 組成,這些 Statement 稱為 substatement,
比如說 { statement1... }
。
我們常利用 {}
來幫程式碼分好幾個區塊。
變數生命週期
複合陳述式都有自己的 scope,當離開 scope 後,scope 裡宣告的變數都會被丟掉(解構)。
|
|
以這個程式例子來說,main 那一行後面有一個 {
,對應最後一行的 }
這是一個 scope,
而裡面有一個 scope 宣告一個變數 a
,然而當離開這個 scope 後,a 將會被程式解構,
因此下面的輸出 a
將因為看不到 a
而發生編譯錯誤。