C - Identifiers: Your Gateway to Naming in Programming

Xin chào các nhà mã hóa tương lai! Hôm nay, chúng ta sẽ bắt đầu một hành trình thú vị vào thế giới lập trình C, đặc biệt tập trung vào các identifiers. Đừng lo nếu bạn chưa từng viết một dòng mã trước đây - chúng ta sẽ bắt đầu từ những điều cơ bản và cùng nhau tiến hóa. Vậy, hãy lấy键盘 (phím ảo) của bạn và cùng tôi nhảy vào!

C - Identifiers

What Are C Identifiers? (Những gì là C Identifiers?)

Hãy tưởng tượng bạn đang ở trong một căn phòng đầy người, và bạn muốn gọi một ai đó. Bạn sẽ sử dụng tên của họ, phải không? Trong thế giới lập trình, identifiers có mục đích tương tự. Chúng là những tên mà chúng ta đặt cho các yếu tố khác nhau trong mã của mình, như các biến, hàm hoặc cấu trúc. Những tên này giúp chúng ta (và máy tính) nhận diện và sử dụng các yếu tố này suốt chương trình của mình.

Why Are Identifiers Important? (Tại sao Identifiers lại quan trọng?)

  1. Readability (Đọc hiểu): Các identifiers tốt giúp mã của bạn dễ hiểu hơn.
  2. Maintainability (Khả năng bảo trì): Các tên rõ ràng giúp bạn dễ dàng cập nhật mã sau này.
  3. Debugging (Gỡ lỗi): Khi có điều gì đó出错, các identifiers được đặt tên tốt có thể là cứu cánh!

Hãy xem một ví dụ đơn giản:

int age = 25;

Ở đây, age là một identifier. Đây là tên chúng ta đã đặt cho một biến lưu trữ tuổi của một người.

Naming Rules of C Identifiers (Quy tắc đặt tên cho C Identifiers)

Bây giờ, cũng giống như trường học của bạn có thể có quy tắc về tên bạn có thể sử dụng (không sử dụng biệt danh trong các tài liệu chính thức!), C có các quy tắc cho việc đặt tên identifiers. Hãy cùng phân tích chúng:

  1. Characters allowed (Ký tự được phép):
  • Chữ cái viết thường (a-z)
  • Chữ cái viết hoa (A-Z)
  • Số (0-9)
  • Dấu gạch dưới (_)
  1. First character (Ký tự đầu tiên): Phải là một chữ cái hoặc dấu gạch dưới. Không được bắt đầu bằng số.

  2. Case sensitivity (Phân biệt chữ hoa chữ thường): age, Age, và AGE là các identifiers khác nhau trong C.

  3. No keywords (Không sử dụng từ khóa): Bạn không thể sử dụng các từ khóa của C làm identifiers.

  4. Length (Độ dài): Mặc dù không có giới hạn chính thức, nhưng phần lớn các bộ biên dịch C chỉ coi 31 ký tự đầu tiên là quan trọng.

Common Naming Conventions (Quy tắc đặt tên phổ biến)

Mặc dù không phải là các quy tắc nghiêm ngặt,但这些 quy tắc giúp mã của bạn dễ đọc hơn:

  • Sử dụng chữ thường cho tên biến: int student_count;
  • Sử dụng chữ hoa cho các hằng số: #define MAX_SIZE 100
  • Sử dụng camelCase cho tên hàm: void calculateTotal();

Examples of C Identifiers (Ví dụ về C Identifiers)

Hãy xem một số identifiers hợp lệ và không hợp lệ:

Valid Identifiers (Identifiers hợp lệ) Invalid Identifiers (Identifiers không hợp lệ) Explanation (Giải thích)
age 2ndPlace Không được bắt đầu bằng số
_count my-variable Dấu gạch ngang không được phép
firstName float float là một từ khóa
MAX_SIZE $total Dấu dollar không được phép
player1 user name Khoảng trống không được phép

Bây giờ, hãy xem chúng trong hành động:

#include <stdio.h>

#define MAX_SIZE 100  // Hợp lệ: Chữ hoa cho hằng số

int main() {
int age = 25;  // Hợp lệ: Chữ thường cho biến
char _initial = 'J';  // Hợp lệ: Có thể bắt đầu bằng dấu gạch dưới
float height_in_cm = 175.5;  // Hợp lệ: Dấu gạch dưới được phép

// Ví dụ không hợp lệ (bị注释 để tránh lỗi):
// int 2ndPlace = 2;  // Không hợp lệ: Bắt đầu bằng số
// float my-height = 175.5;  // Không hợp lệ: Chứa dấu gạch ngang
// char float = 'F';  // Không hợp lệ: `float` là một từ khóa

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

return 0;
}

Khi bạn chạy mã này, bạn sẽ thấy:

Age: 25
Initial: J
Height: 175.5 cm

Mỗi identifier trong chương trình này phục vụ một mục đích cụ thể, giúp mã dễ hiểu và dễ bảo trì.

Scope of C Identifiers (Phạm vi của C Identifiers)

Bây giờ, hãy nói về một điều gì đó phức tạp hơn - phạm vi của identifiers. Hãy tưởng tượng phạm vi như "tính khả见" của một identifier trong chương trình của bạn.

Types of Scope (Các loại phạm vi)

  1. Block Scope: Các biến được宣 bố bên trong một khối (bọc trong {}) chỉ可见 trong khối đó.
  2. File Scope: Các biến được宣 bố bên ngoài tất cả các hàm chỉ可见 trong suốt tệp.
  3. Function Scope: Các nhãn trong một hàm chỉ可见 trong suốt hàm đó.
  4. Function Prototype Scope: Các tham số trong một prototype chỉ可见 cho đến cuối prototype.

Hãy xem chúng trong hành động:

#include <stdio.h>

int globalVar = 10;  // File scope

void exampleFunction() {
int localVar = 20;  // Block scope
printf("Inside function: globalVar = %d, localVar = %d\n", globalVar, localVar);
}

int main() {
printf("In main: globalVar = %d\n", globalVar);
// printf("localVar = %d\n", localVar);  // Điều này sẽ gây ra lỗi

{
int blockVar = 30;  // Block scope
printf("Inside block: blockVar = %d\n", blockVar);
}
// printf("blockVar = %d\n", blockVar);  // Điều này sẽ gây ra lỗi

exampleFunction();

return 0;
}

Chương trình này minh họa các loại phạm vi khác nhau:

  • globalVar có thể truy cập ở mọi nơi.
  • localVar chỉ có thể truy cập trong exampleFunction.
  • blockVar chỉ có thể truy cập trong khối của nó trong main.

Examples of Different Types of C Identifiers (Ví dụ về các loại C Identifiers khác nhau)

Hãy kết thúc với một ví dụ toàn diện minh họa các loại identifiers khác nhau:

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

#define MAX_STUDENTS 50  // Constant identifier

// Function prototype
void printStudentInfo(char name[], int age);

// Structure definition
struct Student {
char name[50];
int age;
float gpa;
};

int main() {
int studentCount = 3;  // Variable identifier
struct Student class1[MAX_STUDENTS];  // Array identifier

// Initializing student data
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;

// Printing student information
for (int i = 0; i < studentCount; i++) {
printStudentInfo(class1[i].name, class1[i].age);
}

return 0;
}

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

Trong ví dụ này, chúng ta đã sử dụng các loại identifiers khác nhau:

  • Constant identifier: MAX_STUDENTS
  • Function identifiers: main, printStudentInfo
  • Structure identifier: Student
  • Variable identifiers: studentCount, name, age, gpa
  • Array identifier: class1

Mỗi identifier đóng một vai trò quan trọng trong việc làm cho chương trình của chúng ta功能性 và dễ đọc.

Và thế là xong, các học trò lập trình của tôi! Chúng ta đã cùng nhau hành trình qua vùng đất của C identifiers, từ định nghĩa cơ bản đến các ví dụ phức tạp. Nhớ rằng việc chọn các identifiers tốt giống như việc chọn đúng phép thuật - nó có thể tạo ra sự khác biệt lớn trong các cuộc phiêu lưu lập trình của bạn. Hãy tiếp tục luyện tập, giữ vững sự tò mò, và trước khi bạn biết, bạn sẽ casting các phép thuật lập trình C như một chuyên gia! Chúc các bạn lập trình vui vẻ!

Credits: Image by storyset