以下是原文翻译成繁體中文的版本:

C - Identifiers

# C - 單元識別:編程中的命名之門

你好,未來的編程巫師們!今天,我們將踏上一段令人興奮的旅程,進入 C 編程的世界,特別聚焦於識別器。別擔心如果你從未寫過一行代碼——我們將從最基礎的知識開始,一起逐步學習。所以,拿起你的虛擬魔杖(鍵盤),讓我們一起深入探討!

## C 認識器是什麼?

想像你在一個滿是人的房間裡,你想叫某個人。你會用他們的名字,對吧?在編程的世界裡,識別器扮演著類似的功能。它們是我們給程序中各種元素(如變量、函數或結構)起的名字。這些名字幫助我們(和計算機)在程序中識別和使用這些元素。

### 為什麼識別器重要?

1. **可讀性**:好的識別器使你的代碼更容易理解。
2. **可維護性**:清晰的名稱在後期更新代碼時非常有幫助。
3. **除錯**:當出現問題時,命名良好的識別器可以是救星!

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

```c
int age = 25;

在這裡,age 是一個識別器。我們給存儲人員年齡的變量起的名字。

C 認識器的命名規則

現在,就像你們學校可能對可以使用哪些名字有規定(正式文件上不能使用綽號!)一樣,C 語言對命名識別器也有規定。讓我們一一介紹:

  1. 允許的字符

    • 小寫字母(a-z)
    • 大寫字母(A-Z)
    • 數字(0-9)
    • 下劃線(_)
  2. 首字符:必須是字母或下劃線。不能以數字開頭。

  3. 大小寫敏感性ageAgeAGE 在 C 語言中都是不同的識別器。

  4. 不能使用關鍵字:你不能將 C 語言的關鍵字用作識別器。

  5. 長度:雖然沒有官方限制,但在大多數 C 編譯器中,前 31 個字符是重要的。

常見的命名習慣

這些習慣雖然不是嚴格的規則,但它們能夠幫助你的代碼更具可讀性:

  • 變量名稱使用小寫:int student_count;
  • 常量名稱使用大寫:#define MAX_SIZE 100
  • 函數名稱使用駝峰式:void calculateTotal();

C 認識器的例子

讓我們看看一些有效和無效的識別器:

有效識別器 無效識別器 解釋
age 2ndPlace 不能以數字開頭
_count my-variable 不允許使用連字符
firstName float float 是關鍵字
MAX_SIZE $total 不允許使用美元符號
player1 user name 不允許使用空格

現在,讓我們看看它在實際中的應用:

#include <stdio.h>

#define MAX_SIZE 100  // 有效:常量使用大寫

int main() {
    int age = 25;  // 有效:變量使用小寫
    char _initial = 'J';  // 有效:可以以下劃線開頭
    float height_in_cm = 175.5;  // 有效:允許使用下劃線

    // 無效示例(為了避免錯誤,已註解):
    // int 2ndPlace = 2;  // 無效:以數字開頭
    // float my-height = 175.5;  // 無效:包含連字符
    // char float = 'F';  // 無效:'float' 是關鍵字

    printf("Age: %d\nInitial: %c\nHeight: %.1f cm\n", age, _initial, height_in_cm);

    return 0;
}

當你運行這段代碼時,你會看到:

Age: 25
Initial: J
Height: 175.5 cm

程序中的每個識別器都扮演著特定角色,使代碼容易理解和維護。

C 認識器的作用域

現在,讓我們來討論一些較為高級的內容——識別器的範圍。將範圍看作是識別器在程序中的“可見性”。

範圍類型

  1. 區塊範圍:在區塊(用 {} 包含)內聲明的變量只在該區塊內可見。
  2. 文件範圍:在所有函數外部聲明的變量在整個文件中都可見。
  3. 函數範圍:函數中的標籤在整個函數中都可見。
  4. 函數原型範圍:函數原型中的參數在原型結束前都可見。

讓我們看看它在實際中的應用:

#include <stdio.h>

int globalVar = 10;  // 文件範圍

void exampleFunction() {
    int localVar = 20;  // 區塊範圍
    printf("Inside function: globalVar = %d, localVar = %d\n", globalVar, localVar);
}

int main() {
    printf("In main: globalVar = %d\n", globalVar);
    // printf("localVar = %d\n", localVar);  // 這會導致錯誤

    {
        int blockVar = 30;  // 區塊範圍
        printf("Inside block: blockVar = %d\n", blockVar);
    }
    // printf("blockVar = %d\n", blockVar);  // 這會導致錯誤

    exampleFunction();

    return 0;
}

這個程序展示了不同的範圍:

  • globalVar 在任何地方都可以訪問。
  • localVar 只能在 exampleFunction 內訪問。
  • blockVar 只能在 main 函數中的區塊內訪問。

不同類型的 C 認識器示例

讓我們以一個綜合示例來結尾,展示各種類型的識別器:

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

#define MAX_STUDENTS 50  // 常量識別器

// 函數原型
void printStudentInfo(char name[], int age);

// 結構定義
struct Student {
    char name[50];
    int age;
    float gpa;
};

int main() {
    int studentCount = 3;  // 變量識別器
    struct Student class1[MAX_STUDENTS];  // 數組識別器

    // 初始化學生數據
    strcpy(class1[0].name, "Alice");
    class1[0].age = 20;
    class1[0].gpa = 3.8;

    strcpy(class1[1].name, "Bob");
    class1[1].age = 22;
    class1[1].gpa = 3.5;

    strcpy(class1[2].name, "Charlie");
    class1[2].age = 21;
    class1[2].gpa = 3.9;

    // 打印學生信息
    for (int i = 0; i < studentCount; i++) {
        printStudentInfo(class1[i].name, class1[i].age);
    }

    return 0;
}

// 函數定義
void printStudentInfo(char name[], int age) {
    printf("Student: %s, Age: %d\n", name, age);
}

在這個示例中,我們使用了各種類型的識別器:

  • 常量識別器:MAX_STUDENTS
  • 函數識別器:mainprintStudentInfo
  • 結構識別器:Student
  • 變量識別器:studentCountnameagegpa
  • 數組識別器:class1

每個識別器都在使程序功能完善和易於閱讀方面扮演著關鍵角色。

而你們,我的編程學徒們!我們已經穿越了 C 認識器的土地,從基本的定義到複雜的示例。記住,選擇好的識別器就像選擇正確的咒語一樣——它可以在你的編程冒險中發揮關鍵作用。持續練習,保持好奇心,在你意識到之前,你將會像專家一樣施展 C 編程的咒語!祝編程愉快!

Credits: Image by storyset