C 語言比較運算子完整教學|基礎用法、範例與常見錯誤解析

1. 前言

C 語言在系統程式設計與嵌入式開發等多個領域被廣泛使用。其中,比較運算子是進行條件判斷與迴圈控制等邏輯運算時不可或缺的元素。

本文將詳細介紹 C 語言中的比較運算子。內容針對初學者說明基本用法,並結合實用的程式碼範例與注意事項,適合剛開始學習程式設計或想要複習基礎的人參考。

2. 什麼是比較運算子?

比較運算子的定義

比較運算子是用來比較兩個值,並返回真(1)或假(0)的運算子。它用於程式中評估條件,尤其是在條件分支(ifswitch)與重複執行(whilefor)時扮演重要角色。

比較運算子的用途

比較運算子常用於以下情況:

  • 條件分支:當特定條件成立時才執行對應處理。
  • 重複執行:在條件成立期間重複執行相同的處理。
  • 使用者輸入驗證:檢查輸入值是否符合條件。

範例:

int a = 10, b = 20;  
if (a < b) {  
    printf("a 小於 b\n");  
}

此程式碼會比較 ab,若條件成立則顯示訊息。

年収訴求

3. C 語言的比較運算子一覽

主要比較運算子與功能

以下表格整理了 C 語言常用的比較運算子。

運算子意義使用範例結果
==相等a == b真或假
!=不相等a != b真或假
>大於a > b真或假
<小於a < b真或假
>=大於或等於a >= b真或假
<=小於或等於a <= b真或假

簡單範例

以下是比較運算子的基本使用範例。

int x = 15, y = 20;

// 是否相等
if (x == y) {
    printf("x 等於 y\n");
} else {
    printf("x 不等於 y\n");
}

// 是否小於
if (x < y) {
    printf("x 小於 y\n");
}

// 是否大於或等於
if (x >= 10) {
    printf("x 大於或等於 10\n");
}

透過比較運算子,可以靈活地進行各種條件判斷。

4. 各運算子的詳細說明與程式範例

4.1 相等(==)與不相等(!=)

==(相等)運算子用於比較兩個值是否相等,返回真(1)或假(0)。
!=(不相等)運算子用於判斷兩個值是否不相等。

程式範例:

#include <stdio.h>

int main() {
    int a = 10, b = 20;

    // 判斷是否相等
    if (a == b) {
        printf("a 等於 b\n");
    } else {
        printf("a 不等於 b\n");
    }

    // 判斷是否不相等
    if (a != b) {
        printf("a 不等於 b\n");
    }

    return 0;
}

輸出結果:

a 不等於 b
a 不等於 b

注意事項:

  • 注意不要將 === 混淆。
  • == 是比較運算子,用於檢查是否相等。
  • = 是指定(賦值)運算子,用於將值賦給變數。

4.2 大小比較(>、<、>=、<=)

用於大小比較的運算子有以下四種:

運算子意義使用範例
>大於a > b
<小於a < b
>=大於或等於a >= b
<=小於或等於a <= b

程式範例:

#include <stdio.h>

int main() {
    int x = 15, y = 10;

    // 大小比較
    if (x > y) {
        printf("x 大於 y\n");
    }
    if (x < y) {
        printf("x 小於 y\n");
    }
    if (x >= 15) {
        printf("x 大於或等於 15\n");
    }
    if (y <= 10) {
        printf("y 小於或等於 10\n");
    }

    return 0;
}

輸出結果:

x 大於 y
x 大於或等於 15
y 小於或等於 10

注意事項:

  • 大小比較在條件判斷與迴圈處理中非常常用。
  • 也適合用於檢查函式內的數值範圍。

5. 比較運算子的優先順序與結合性

5.1 運算子的優先順序

使用比較運算子時,需要理解運算的優先順序與結合性。

比較運算子的優先順序如下:

  1. 算術運算子(+, -, *, /, %
  2. 比較運算子(>, <, >=, <=
  3. 等號運算子(==, !=
  4. 邏輯運算子(&&, ||

運算會依照以上順序進行評估。

範例:

if (a + b > c * d) {
    printf("運算結果為真\n");
}

在此程式中,a + bc * d 會先被計算,接著才會進行 > 的比較。

5.2 結合性

結合性決定了當相同優先順序的運算子出現時的運算方向。

  • 比較運算子的運算方向是由左至右

範例:

if (a > b && b < c) {
    printf("條件成立\n");
}

在這個例子中,會先評估 a > b,再將結果作為 && 左邊的條件進行計算。

6. 注意事項

6.1 賦值運算子與比較運算子的混淆

初學者常犯的錯誤之一,是混淆 === 的用途。

錯誤範例:

if (a = b) { // 這是將 b 賦值給 a
    printf("相等\n");
}

在此程式中,a 被賦予 b 的值,且賦值結果(非 0)會被判斷為真。

正確範例:

if (a == b) { // 這是比較 a 與 b
    printf("相等\n");
}

防呆技巧:
為了避免混淆,可以使用「尤達寫法」(Yoda Conditions)。

if (10 == a) { // 尤達寫法
    printf("相等\n");
}

這種寫法如果誤用 = 會在編譯時出現錯誤,有助於防止 Bug。

6.2 除錯時的注意要點

為了避免在使用比較運算子的條件式中出現錯誤,可以注意以下幾點:

  1. 避免混淆賦值運算子與比較運算子
  • 務必檢查 === 的使用。
  1. 啟用 IDE 的警告功能
  • 在 IDE 中開啟「顯示所有警告」選項,以便偵測潛在錯誤。
  1. 善用除錯工具
  • 使用 Visual Studio Code 或 Code::Blocks 的除錯器檢查變數狀態。
  1. 利用單元測試
  • 在正式運行前,先測試條件判斷是否如預期執行。

7. 常見問題(FAQ)

Q1: 使用多個比較運算子時應注意什麼?

A: 當使用多個條件時,建議適當加上括號,以明確表達運算順序。

範例:

int a = 5, b = 10, c = 15;

// 加括號的安全寫法
if ((a < b) && (b < c)) {
    printf("a 小於 b,且 b 小於 c\n");
}

要點:

  • 使用括號可提升條件式的可讀性與安全性。
  • 可避免因運算子優先順序造成的誤判。

Q2: 如何比較字串是否相等?

A: 在 C 語言中,字串是以陣列形式儲存,不能直接用比較運算子進行比較,應使用 strcmp 函式。

範例:

#include <stdio.h>
#include <string.h>

int main() {
    char str1[] = "apple";
    char str2[] = "apple";

    // 比較字串
    if (strcmp(str1, str2) == 0) {
        printf("字串相等\n");
    } else {
        printf("字串不相等\n");
    }

    return 0;
}

輸出結果:

字串相等

要點:

  • strcmp 會在字串相同時回傳 0。
  • 若要忽略大小寫比較,可使用 strcasecmp(需系統支援)。

Q3: 如何避免除錯時出現常見錯誤?

A: 可以注意以下事項:

  1. 避免混淆賦值運算子與比較運算子。
  2. 啟用 IDE 警告。
  3. 使用除錯工具。
  4. 進行單元測試。

8. 總結與練習題

總結

C 語言的比較運算子是控制條件分支與迴圈的核心工具。本文介紹了各種比較運算子的用法、範例、優先順序與注意事項。

學習重點回顧:

  • 理解比較運算子的種類與用途。
  • 透過程式範例掌握各運算子的用法。
  • 注意賦值運算子與比較運算子的差異。
  • 從 FAQ 中獲取實用技巧。

練習題

題目 1: 下列程式會輸出什麼?

int a = 5, b = 10;
if (a < b && b > 0) {
    printf("條件成立\n");
}

題目 2: 使用 strcmp 函式比較字串 “hello” 與 “world” 是否相等的程式。

提示:

  • 題目 1 請思考條件式的判斷流程。
  • 題目 2 請正確使用 strcmp 並加入條件判斷。
年収訴求