Xem thêm

Khám Phá Thế Giới Lập Trình C/C++: Từ A đến Z

Huy Erick
Giới Thiệu Bài viết này là cánh cửa đầu tiên dẫn bạn vào thế giới đầy mê hoặc của lập trình C/C++, một ngôn ngữ lập trình mạnh mẽ và linh hoạt đã và đang...

Giới Thiệu

Bài viết này là cánh cửa đầu tiên dẫn bạn vào thế giới đầy mê hoặc của lập trình C/C++, một ngôn ngữ lập trình mạnh mẽ và linh hoạt đã và đang là nền tảng cho vô số ứng dụng và hệ thống.

Chúng ta sẽ cùng nhau "giải mã" những khái niệm cơ bản nhất, từ cú pháp, kiểu dữ liệu, biến, hàm, đến các cấu trúc điều khiển, cũng như tìm hiểu về phạm vi và khả năng hiển thị của biến trong C. Đặc biệt, bài viết sẽ đi sâu vào phân tích cách thức cấp phát bộ nhớ cho các biến dựa trên phạm vi của chúng, một yếu tố quan trọng để hiểu rõ hơn về cách thức hoạt động của chương trình.

Hãy chuẩn bị tinh thần để bước vào một hành trình thú vị, nơi bạn sẽ được trang bị những kiến thức nền tảng vững chắc để tự tin chinh phục thế giới lập trình C/C++!

Cú pháp trong C/C++

Ngôn ngữ C/C++ là sự kết hợp của nhiều loại cú pháp khác nhau, bao gồm:

  • Cú pháp C
  • Cú pháp Präprozessor
  • Cú pháp định dạng Printf/Scanf
  • Mô phỏng thiết bị đầu cuối
  • Hướng dẫn cho Compiler/Linker

Trong phạm vi bài viết này, chúng ta sẽ tập trung vào ba loại cú pháp đầu tiên, những yếu tố cốt lõi để bắt đầu hành trình khám phá C/C++. Hai loại cú pháp còn lại sẽ được đề cập sơ lược và có thể được tìm hiểu sâu hơn ở các tài liệu chuyên sâu khác.

Chú thích trong mã nguồn

Để giúp cho mã nguồn dễ đọc và dễ hiểu hơn, việc thêm các chú thích là rất cần thiết. Compiler sẽ tự động bỏ qua các chú thích trong quá trình dịch mã, giúp cho mã nguồn của bạn trở nên gọn gàng và dễ quản lý hơn.

Cú pháp chú thích trong C/C++

C/C++ cung cấp hai cách để thêm chú thích vào mã nguồn:

  • Chú thích khối: /* */ - Cho phép viết chú thích trên nhiều dòng. Tuy nhiên, cần lưu ý rằng chú thích khối không thể được lồng vào nhau. Cặp ký tự */ đầu tiên sẽ kết thúc chú thích, bất kể số lượng cặp /* đã được mở trước đó.

  • Chú thích dòng: // - Cho phép viết chú thích trên một dòng, bắt đầu từ vị trí của // cho đến hết dòng.

Ví dụ minh họa

/* Đây là một chú thích khối    có thể kéo dài trên nhiều dòng */  // Đây là một chú thích dòng  int x = 10;  // Khai báo biến x và gán giá trị 10

Quy tắc đặt tên

Trong C/C++, việc đặt tên biến và hàm phải tuân thủ các quy tắc sau:

  • Tên biến và hàm có thể bao gồm chữ cái, số và dấu gạch dưới.
  • Tên phải bắt đầu bằng một chữ cái hoặc dấu gạch dưới.
  • C/C++ phân biệt chữ hoa và chữ thường (case-sensitive).
  • Không được sử dụng từ khóa của ngôn ngữ để đặt tên biến hoặc hàm.

Quy ước đặt tên thư viện

Dưới đây là một số quy ước đặt tên thường được sử dụng trong thư viện C/C++:

  • Từ khóa và tên hàm thư viện chuẩn thường được viết thường.
  • Trong thư viện C, tên hàm thường được viết tắt (ví dụ: isalnum() để kiểm tra xem một ký tự có phải là chữ cái hoặc số hay không).
  • Macro thường được viết hoa và có thể sử dụng dấu gạch dưới để phân cách các từ.
  • Tên bắt đầu bằng hai dấu gạch dưới hoặc một dấu gạch dưới theo sau là một chữ cái hoa (ví dụ: __LINE__, _Reserved) được dành riêng cho trình biên dịch và thư viện chuẩn C. Bạn không nên sử dụng những tên này trong chương trình của mình.

Nối dòng trong C/C++

Để tăng khả năng đọc và tổ chức mã nguồn, C/C++ cho phép nối dòng bằng cách sử dụng dấu gạch chéo ngược (\). Trình biên dịch sẽ tự động loại bỏ dấu gạch chéo ngược và dòng mới, kết hợp các dòng thành một dòng duy nhất.

Ví dụ

#include   int main() {   printf("Đây là một dòng rất dài và \   chúng ta có thể sử dụng dấu gạch chéo ngược \   để nối dòng.");   return 0; }

Phạm vi và khả năng hiển thị của biến

Trong lập trình, phạm vi của biến (scope) xác định vùng mã mà biến có thể được truy cập và sử dụng. C/C++ hỗ trợ các loại phạm vi sau:

  • Phạm vi hàm (Function Scope): Biến được khai báo bên trong một hàm chỉ có thể được truy cập từ bên trong hàm đó.
  • Phạm vi tệp (File Scope): Biến được khai báo bên ngoài bất kỳ hàm nào có thể được truy cập từ bất kỳ đâu trong tệp hiện tại.
  • Phạm vi khối (Block Scope): Biến được khai báo bên trong một khối mã (bao gồm bởi cặp dấu ngoặc nhọn {}) chỉ có thể được truy cập từ bên trong khối đó.
  • Phạm vi nguyên mẫu hàm (Function Prototype Scope): Phạm vi này áp dụng cho các tham số được khai báo trong nguyên mẫu hàm.

Biến toàn cục và biến cục bộ

Để dễ hình dung hơn, ta có thể phân loại biến thành hai loại chính:

  • Biến toàn cục: Có phạm vi toàn cục (file scope) và có thể được truy cập từ bất kỳ đâu trong chương trình.
  • Biến cục bộ: Có phạm vi cục bộ (hàm, khối) và chỉ có thể được truy cập từ bên trong phạm vi khai báo.

Ví dụ

#include   int global_var = 10; // Biến toàn cục  int main() {   int local_var = 20; // Biến cục bộ    printf("global_var = %d\n", global_var);   printf("local_var = %d\n", local_var);    {     int block_var = 30; // Biến cục bộ trong khối      printf("block_var = %d\n", block_var);   }    // Lỗi: Không thể truy cập block_var từ đây   // printf("block_var = %d\n", block_var);    return 0; }

Cấp phát bộ nhớ

Tùy thuộc vào phạm vi của biến, bộ nhớ sẽ được cấp phát ở các vùng khác nhau:

  • Biến toàn cục: Được cấp phát bộ nhớ tĩnh, tồn tại trong suốt thời gian chương trình chạy.
  • Biến cục bộ: Được cấp phát bộ nhớ động trên stack, được giải phóng khi hàm hoặc khối kết thúc.
Hình ảnh mô tả cách thức tổ chức bộ nhớ của một chương trình C, bao gồm các vùng TEXT, DATA, BSS, HEAP và STACK.
Hình ảnh mô tả cách thức tổ chức bộ nhớ của một chương trình C, bao gồm các vùng TEXT, DATA, BSS, HEAP và STACK.

Định nghĩa và khai báo (Prototype)

C/C++ sử dụng khái niệm định nghĩa và khai báo để tổ chức mã nguồn và cho phép biên dịch chương trình theo từng phần.

  • Định nghĩa: Cung cấp đầy đủ thông tin về biến, hàm, hoặc kiểu dữ liệu, bao gồm cả việc cấp phát bộ nhớ.
  • Khai báo (Prototype): Thông báo cho trình biên dịch về sự tồn tại của biến, hàm, hoặc kiểu dữ liệu mà chưa cần định nghĩa đầy đủ.

Ví dụ

// Khai báo nguyên mẫu hàm int sum(int a, int b);  int main() {   int result = sum(10, 20); // Gọi hàm sum   printf("result = %d\n", result);   return 0; }  // Định nghĩa hàm sum int sum(int a, int b) {   return a + b; }

Tổng kết

Bài viết đã giới thiệu đến bạn những kiến thức cơ bản về lập trình C/C++, bao gồm cú pháp, biến, hàm, phạm vi và cấp phát bộ nhớ. Hy vọng rằng bài viết này sẽ là bước đệm vững chắc giúp bạn tự tin hơn trên con đường chinh phục ngôn ngữ lập trình đầy thú vị này. Hãy tiếp tục theo dõi các bài viết tiếp theo để khám phá thêm nhiều điều mới mẻ và hấp dẫn trong thế giới C/C++ nhé!

1