Appearance
更多運算子
前篇介紹了加(+)、減(-)、乘(*)、除(/)、餘(%)這些基本的運算,但 C 不只有這些運算方法。
運算並賦值
在之前,或許你會這麼寫
c
x = x + 1;
x = x * 3;
x = x - a + b;但在 C 中,對於簡單的運算可以直接把算符與等號連接來達成一樣的效果
x += 1;
x *= 3;
x -= a - b;位元運算
這邊介紹的運算子都不太實用,在使用的同時會讓可讀性下降,但會讓程式便簡潔。
你或許知道 A且B、A或B 等運算規則,在C中,其實可以直接對整數及字元做這樣的運算,因為這些數值都是以0/1的方式存在,如果單獨對每個位元做這些運算就可以得到一個新的數字。
c
x << 1; // x * 2
x >> 1; // x / 2
3 & 2; // 011 and 010 = 010 = 2
3 | 4; // 011 or 100 = 111 = 7
3 ^ 6; // 011 xor 110 = 101 = 5
x <<= 1; // x *= 2快速加減
除了寫 +=1 (-=1) 你還可以寫 ++ (--),但不同的位置會造成不一樣的結果
c
x += 1;
printf("%d", x); // output x可以寫成這樣
c
x++;
printf("%d", x);也可以放在前面,縮減一行
c
printf("%d", ++x);放在後面(x++)時,+1 會等到這行程式運行完才運行;放在前面(++x)時,則會先做 +1 才執行剩餘程式,因此上面的所有程式都會輸出一樣的結果。
微不足道的優化
或許你會在很多地方看到別人說 ++x 比較快速,但在 Assembly 層面,他只優化掉了一行指令,而且現代 Compiler 已經十分智能,多數情況完全不會有差異,因此選擇自己喜歡的寫法即可。
先乘除後加減
當一個表達式(Expression)中出現多個運算子時,C 語言會根據一套嚴格的規則來決定誰先執行。這就像數學裡的「先乘除後加減」,但在程式世界裡,規則更多了一些。
| 優先級 | 運算子類型 | 符號 | 結合性(方向) |
|---|---|---|---|
| 最高 | 括號 | () | 左至右 |
| 中 | 乘、除、餘數 | *, /, % | 左至右 |
| 低 | 加、減 | +, - | 左至右 |
| 最低 | 賦值 | = | 右至左 |
先看優先級
再看結合性,10/2*5 是先計算 10/2
注意事項
- 不確定的話加括號
- 為了可讀性加括號
++a的優先級最高,a++則沒有影響,但請不要把++與--直接加入表達式中,這會讓程式幾乎無法理解