C語言中的運算符優先級

Hello, 動手的程式設計師們!今天,我們將要深入探討C語言中運算符優先級的迷人世界。如果你是程式設計的新手,不必擔心——我會一步步地引導你理解這個概念,就像我過去幾年來為無數學生做的那樣。讓我們一起踏上這次旅程吧!

C - Operator Precedence

運算符優先級是什麼?

想像你正在廚房裡按照食譜做菜。你添加食材和執行動作的順序會對最終的菜肴產生重大影響。同樣地,在C語言編程中,操作的執行順序會大大影響你的代碼結果。這就是運算符優先級發揮作用的時候。

運算符優先級决定了表達式中不同運算符的評估值順序。這就像一套規則,編譯器會遵循它來決定先執行哪個操作。

讓我們看一個簡單的例子:

int result = 5 + 3 * 2;

你認為result的值會是什麼?如果你猜的是11,那麼你答對了!但為什麼呢?

乘法運算符*的優先級高於加法運算符+。所以,3 * 2會先被評估(得到6),然後5會被加到它上面。

如果我們想改變操作的順序,我們可以使用括號:

int result = (5 + 3) * 2;

現在,result會是16,因為括號強制先執行加法。

優先級表

為了幫助你記住C語言中各種運算符的優先級,我們來看一張表。表中位於較高位置的運算符具有較高的優先級。

優先級 運算符 描述
1 () [] -> . 括號、數組下標、成員訪問
2 ! ~ ++ -- + - * & (type) sizeof 一元運算符、sizeof、類型轉換
3 * / % 乘法、除法、模數
4 + - 加法、減法
5 << >> 位運算左移、右移
6 < <= > >= 運行符
7 == != 等於、不等於
8 & 位運算AND
9 ^ 位運算XOR
10 | 位運算OR
11 && 邏輯AND
12 || 邏輯OR
13 ?: 條件運算符
14 = += -= *= /= %= &= ^= = <<= >>=
15 , 逗號運算符

如果這看起來讓人不知所措——我們會通過例子來逐一解析!

運算符優先級的例子

讓我們看一些例子來理解運算符優先級在實際中是如何工作的。

示例 1:算術運算符

int result = 10 + 5 * 2 - 3 / 2;

評估這個表達式:

  1. 首先,5 * 2被計算(得到10)
  2. 接著,3 / 2被計算(得到1,因為整數除法會截斷)
  3. 最後,我們得到10 + 10 - 1,這等於19

所以,result會是19。

示例 2:混合算術和關係運算符

int x = 5;
int y = 3;
int z = 2;
int result = x > y + z && y < x * z;

讓我們分解一下:

  1. y + z先被評估(3 + 2 = 5)
  2. x * z被計算(5 * 2 = 10)
  3. x > y + z變成5 > 5,這是假的(0)
  4. y < x * z變成3 < 10,這是真的(1)
  5. 最後,0 && 1被評估,這是假的(0)

因此,result會是0(假的)。

運算符結合性

現在我們已經講完了優先級,來談談結合性。當運算符具有相同的優先級時,結合性決定了評估的順序。

有兩種結合性類型:

  1. 從左到右
  2. 從右到左

大多數C語言中的運算符都是從左到右結合的,意味著它們從左到右被評估。然而,有些運算符,如賦值運算符,是從右到左結合的。

從左到右結合性的示例

int a = 10 - 5 - 3;

這被評估為(10 - 5) - 3,結果是2。

從右到左結合性的示例

int x, y, z;
x = y = z = 5;

這被評估為x = (y = (z = 5)),將5賦值給所有三個變量。

後置/前置增量/減量運算符的優先級

現在,讓我們來處理一個棘手的主題:增量和減量運算符。這些運算符可以用兩種方式使用:前置(在變量之前)和後置(在變量之後)。

  • 前置:++x--x
  • 後置:x++x--

前置版本具有高於後置版本的優先級。讓我們看看這在代碼中是如何運作的:

int x = 5;
int y = ++x * 2;

在這裡,x會先增加到6,然後再乘以2,所以y會變成12。

現在我們將其改為後置:

int x = 5;
int y = x++ * 2;

在這種情況下,x會在乘法之前被使用,所以y會變成10,操作之後x會變成6。

一個有趣的比喻

把前置增量想像成在離開房子之前穿上鞋子,而後置增量就像是抓起鞋子然後在離開後穿上。前置是立即完成工作,而後置則是等到主要動作之後。

結論

理解運算符優先級和結合性對於編寫正確和高效的C程序至關重要。這就像學習一種新語言的語法——起初可能看起來複雜,但隨著練習,它會變得習以為常。

記住,當你感到疑惑時,使用括號來清楚表達你的意圖。這不僅能確保你的代碼按預期工作,還能讓其他人(以及未來的你)更容易閱讀!

繼續練習,很快你就能像一名專業廚師在他的廚房裡一樣,知道在完美的時機添加每種食材,以達到完美結果!

Credits: Image by storyset