Bài 1.6. Biến và hằng trong C++

Trong bất kỳ ngôn ngữ lập trình nào, việc lưu trữ và thao tác với dữ liệu là cốt lõi. Hãy tưởng tượng bạn đang viết một chương trình máy tính để quản lý điểm số của sinh viên, tính toán hóa đơn, hay điều khiển một nhân vật trong game. Tất cả những công việc này đều đòi hỏi phải có nơi để cất giữ thông tin như tên sinh viên, giá tiền một món hàng, hay vị trí của nhân vật. Trong C++, hai khái niệm cơ bản nhất để làm điều này chính là Biến (Variables)Hằng (Constants).

Bài học này sẽ đưa bạn đi sâu vào thế giới của biến và hằng, giúp bạn hiểu rõ bản chất, cách sử dụng và tầm quan trọng của chúng.

1. Biến (Variables) trong C++

a. Biến là gì?

Một cách dễ hiểu, biến là một cái tên mà bạn đặt cho một vùng nhớ trong máy tính để lưu trữ dữ liệu. Giống như bạn dán nhãn lên những chiếc hộp để biết bên trong chứa gì, bạn dùng biến để đặt tên cho các giá trị trong chương trình của mình.

Điểm đặc biệt của biến là giá trị mà nó lưu trữ có thể thay đổi trong quá trình chương trình thực thi. Ví dụ, biến diemSo có thể bắt đầu bằng 8, sau đó thay đổi thành 9 khi có điểm cộng.

b. Khai báo và Khởi tạo biến

Để sử dụng một biến, đầu tiên bạn phải khai báo nó. Khai báo biến là hành động báo cho trình biên dịch biết: "Này, hãy dành cho tôi một vùng nhớ, tôi sẽ gọi nó bằng cái tên này và nó sẽ chứa kiểu dữ liệu này."

Cú pháp khai báo biến:

kieu_du_lieu ten_bien;

Khởi tạo là việc gán một giá trị ban đầu cho biến ngay tại thời điểm khai báo. Đây là một thói quen lập trình rất tốt để tránh các lỗi không mong muốn do biến chứa giá trị "rác".

Cú pháp khai báo và khởi tạo:

kieu_du_lieu ten_bien = gia_tri_ban_dau;

Hãy xem một vài ví dụ:

#include <iostream>
#include <string>
using namespace std;

int main() {
    // --- KHAI BÁO BIẾN ---
    int soTuoi; // Khai báo một biến kiểu số nguyên tên là soTuoi
    double diemTrungBinh; // Khai báo biến kiểu số thực
    char kyTuDauTien; // Khai báo biến kiểu ký tự

    // --- KHAI BÁO VÀ KHỞI TẠO ---
    int soLuongSinhVien = 50; // Khởi tạo biến soLuongSinhVien với giá trị 50
    double PI = 3.14159; // Khởi tạo biến PI
    char loaiGioiTinh = 'M'; // Ký tự được đặt trong dấu nháy đơn ' '
    bool daTotNghiep = false; // Biến boolean chỉ có hai giá trị: true hoặc false
    string hoVaTen = "Nguyen Van A"; // Chuỗi ký tự được đặt trong dấu nháy kép " "

    // In giá trị các biến đã khởi tạo ra màn hình
    cout << "So luong sinh vien: " << soLuongSinhVien << endl;
    cout << "Ho va ten: " << hoVaTen << endl;
    cout << "Da tot nghiep? " << daTotNghiep << endl; // false sẽ được in ra là 0

    return 0;
}
c. Các quy tắc vàng khi đặt tên biến

Việc đặt tên biến không chỉ là để chương trình chạy được, mà còn để bạn và người khác có thể đọc hiểu code dễ dàng. Hãy tuân thủ các quy tắc sau:

  1. Tên biến chỉ có thể chứa chữ cái (a-z, A-Z), chữ số (0-9) và dấu gạch dưới (_).
  2. Tên biến không được bắt đầu bằng một chữ số.
  3. Tên biến có phân biệt chữ hoa, chữ thường (diemSo khác với DiemSo).
  4. Tên biến không được trùng với các từ khóa của C++ (ví dụ: int, return, class, for...).
  5. Lời khuyên: Hãy đặt tên biến sao cho có ý nghĩa, thể hiện rõ mục đích của biến đó (ví dụ: chieuDai, chieuRong thay vì a, b).
d. Phạm vi của biến (Variable Scope)

Phạm vi của biến xác định nơi mà biến đó có thể được truy cập trong code.

  • Biến cục bộ (Local Variables): Được khai báo bên trong một hàm hoặc một khối lệnh {}. Chúng chỉ tồn tại và có thể được sử dụng bên trong hàm/khối lệnh đó.
  • Biến toàn cục (Global Variables): Được khai báo bên ngoài tất cả các hàm. Chúng có thể được truy cập từ bất kỳ đâu trong chương trình. Tuy nhiên, nên hạn chế tối đa việc sử dụng biến toàn cục vì nó làm code khó quản lý và dễ gây lỗi.
#include <iostream>

// dayLaBienToanCuc có thể được truy cập ở mọi nơi
int dayLaBienToanCuc = 100;

void motHamNaoDo() {
    // dayLaBienCucBo chỉ tồn tại trong hàm này
    int dayLaBienCucBo = 20;
    cout << "Gia tri bien toan cuc trong ham: " << dayLaBienToanCuc << endl;
    cout << "Gia tri bien cuc bo trong ham: " << dayLaBienCucBo << endl;
}

int main() {
    cout << "Gia tri bien toan cuc trong main: " << dayLaBienToanCuc << endl;

    motHamNaoDo();

    return 0;
}

2. Hằng số (Constants) trong C++

a. Hằng là gì?

Trái ngược với biến, hằng là một giá trị không thể thay đổi sau khi đã được định nghĩa. Chúng ta sử dụng hằng cho các giá trị cố định như số PI, số ngày trong tuần, hay một ngưỡng giới hạn nào đó.

Lợi ích của việc dùng hằng:

  • Dễ đọc, dễ bảo trì: Thay vì dùng con số 3.14159 ở nhiều nơi, bạn chỉ cần dùng hằng PI. Nếu sau này muốn tăng độ chính xác, bạn chỉ cần sửa ở một chỗ duy nhất.
  • Tránh lỗi: Trình biên dịch sẽ báo lỗi nếu bạn vô tình cố gắng thay đổi giá trị của một hằng.
b. Cách tạo hằng

Trong C++, có hai cách phổ biến để định nghĩa hằng.

Cách 1: Dùng từ khóa const (Cách được khuyên dùng)

Đây là cách hiện đại, an toàn và linh hoạt của C++. Nó tạo ra một hằng có kiểu dữ liệu rõ ràng.

Cú pháp:

const kieu_du_lieu TEN_HANG = gia_tri;

Thông thường, tên hằng được viết hoa toàn bộ để dễ phân biệt với biến.

#include <iostream>

int main() {
    const double PI = 3.1415926535;
    const int SO_NGAY_TRONG_TUAN = 7;
    const string TEN_WEBSITE = "fullhousedev.com";

    cout << "So PI: " << PI << endl;
    cout << "Ten website: " << TEN_WEBSITE << endl;

    // Dòng lệnh sau sẽ gây lỗi biên dịch vì bạn không thể thay đổi giá trị của hằng
    // PI = 3.14; 

    return 0;
}
Cách 2: Dùng #define (Preprocessor Directive)

Đây là một cách cũ hơn, hoạt động ở giai đoạn tiền xử lý. Về cơ bản, nó sẽ tìm và thay thế tất cả các vý hiện của TEN_HANG bằng gia_tri trong code của bạn trước khi quá trình biên dịch bắt đầu.

Cú pháp:

#define TEN_HANG gia_tri

Lưu ý: Không có dấu chấm phẩy (;) ở cuối.

#include <iostream>

// Dòng này sẽ được tiền xử lý, thay thế mọi chữ PI trong code bằng 3.14159
#define PI 3.14159 

int main() {
    double banKinh = 5.0;
    double chuVi = 2 * PI * banKinh;

    cout << "Chu vi hinh tron: " << chuVi << endl;

    return 0;
}
c. const vs. #define: Nên chọn gì?

Luôn luôn ưu tiên dùng const thay vì #define để định nghĩa hằng. Lý do:

  • An toàn về kiểu dữ liệu: const tạo ra một hằng có kiểu dữ liệu cụ thể (const int, const double), trình biên dịch có thể kiểm tra lỗi kiểu dữ liệu. #define chỉ là thay thế văn bản thuần túy, không có khái niệm về kiểu.
  • Phạm vi (Scope): Hằng const tuân theo các quy tắc về phạm vi giống như biến (có thể là cục bộ hoặc toàn cục). #define có phạm vi toàn cục từ điểm nó được định nghĩa cho đến hết file, điều này có thể gây ra các xung đột không mong muốn.
  • Gỡ lỗi (Debugging): Khi gỡ lỗi, debugger "hiểu" được các hằng const và hiển thị tên của chúng. Với #define, debugger chỉ thấy giá trị thuần túy, làm việc gỡ lỗi khó khăn hơn.

Vậy là bạn đã nắm được những viên gạch nền tảng nhất về việc lưu trữ dữ liệu trong C++. Hiểu rõ và sử dụng thành thạo biến và hằng sẽ giúp bạn viết ra những đoạn code sạch sẽ, hiệu quả và dễ quản lý hơn rất nhiều.

Comments

There are no comments at the moment.