Skip to content

更多運算子

前篇介紹了加(+)、減(-)、乘(*)、除(/)、餘(%)這些基本的運算,但 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 語言會根據一套嚴格的規則來決定誰先執行。這就像數學裡的「先乘除後加減」,但在程式世界裡,規則更多了一些。

優先級運算子類型符號結合性(方向)
最高括號()左至右
乘、除、餘數*, /, %左至右
加、減+, -左至右
最低賦值=右至左
  1. 先看優先級

  2. 再看結合性,10/2*5 是先計算 10/2

注意事項
  • 不確定的話加括號
  • 為了可讀性加括號
  • ++a 的優先級最高,a++則沒有影響,但請不要把++與--直接加入表達式中,這會讓程式幾乎無法理解