C++: Cấu trúc Chương Trình và Kiểu Dữ Liệu Biến

Bài viết này cung cấp kiến thức cơ bản về cấu trúc chương trình C++ và các kiểu dữ liệu biến. Phần đầu tiên tập trung vào cách tổ chức một chương trình C++, bao gồm các thành phần như tệp tiêu đề, hàm chính, câu lệnh và chú thích. Việc sử dụng namespace được giới thiệu như một phương pháp để làm cho mã nguồn ngắn gọn và dễ đọc hơn. Phần thứ hai đi sâu vào các loại biến và kiểu dữ liệu trong C++, bao gồm cách khai báo, khởi tạo và các kiểu dữ liệu cơ bản.

Cấu trúc chương trình

Để bắt đầu học lập trình C++, cách tốt nhất là thực hành viết mã. Chương trình "Hello World" kinh điển là một ví dụ điển hình, dù đơn giản nhưng bao gồm các thành phần cốt lõi của một chương trình C++:

// Chương trình C++ đầu tiên của tôi
#include <iostream>

int main()
{
  std::cout << "Hello World!";
  return 0; // Thêm return 0 cho hàm main
}

Hãy phân tích chương trình này từng dòng:

  • // my first program in C++: Dấu hai gạch chéo (//) cho biết phần còn lại của dòng là một chú thích. Chú thích không ảnh hưởng đến hoạt động của chương trình mà giúp lập trình viên ghi chú giải thích về mã nguồn.
  • #include <iostream>: Các dòng bắt đầu bằng dấu thăng (#) là các chỉ thị cho bộ tiền xử lý. #include <iostream> yêu cầu bộ tiền xử lý đưa mã nguồn từ tệp tiêu đề iostream vào. Tệp này cung cấp các chức năng nhập/xuất chuẩn, cho phép hiển thị "Hello World!" ra màn hình.
  • Dòng trống: Dòng trống không có tác dụng gì với chương trình, chỉ làm tăng tính dễ đọc của mã.
  • int main (): Dòng này khai báo một hàm. Hàm main là hàm đặc biệt, là điểm bắt đầu thực thi của mọi chương trình C++. Nó trả về một giá trị kiểu int.
  • { và }: Các dấu ngoặc nhọn này đánh dấu sự bắt đầu và kết thúc của khối mã trong hàm main.
  • std::cout << "Hello World!";: Đây là một câu lệnh C++. std::cout đại diện cho luồng xuất chuẩn (thường là màn hình), toán tử << là toán tử chèn (insertion operator), và "Hello World!" là chuỗi ký tự được chèn vào luồng xuất. Câu lệnh kết thúc bằng dấu chấm phẩy (;).

Cú pháp của C++ không quá khắt khe về việc xuống dòng hay thụt lề. Các câu lệnh có thể viết liền nhau hoặc tách ra nhiều dòng, miễn là được phân tách bằng dấu chấm phẩy.

Ví dụ sau thêm một câu lệnh xuất nữa:

// Chương trình C++ thứ hai
#include <iostream>
using namespace std; // Sử dụng namespace std

int main ()
{
  cout << "Hello World! ";
  cout << "Tôi là một chương trình C++";
  return 0;
}

Chú thích

C++ hỗ trợ hai loại chú thích:

  • Chú thích một dòng: Bắt đầu bằng // và kéo dài đến hết dòng.
  • Chú thích nhiều dòng (khối): Bắt đầu bằng /* và kết thúc bằng */.
/* Đây là chú thích
   kéo dài nhiều dòng */
#include <iostream>
using namespace std;

int main ()
{
  cout << "Hello World! ";     // Xuất dòng chào
  cout << "Tôi là một chương trình C++"; // Xuất thông điệp
  return 0;
}

Sử dụng namespace std

Để tránh việc phải gõ std:: lặp đi lặp lại khi sử dụng các thành phần của thư viện chuẩn C++, chúng ta có thể sử dụng chỉ thị using namespace std;. Điều này cho phép truy cập trực tiếp các thành phần như cout mà không cần tiền tố std::.

// Chương trình C++ thứ hai với using namespace
#include <iostream>
using namespace std; // Tuyên bố sử dụng namespace std

int main ()
{
  cout << "Hello World! ";
  cout << "Tôi là một chương trình C++";
  return 0;
}

Biến và Kiểu Dữ Liệu

Biến là một vùng nhớ được đặt tên để lưu trữ giá trị. Mỗi biến cần có một tên duy nhất (định danh) và một kiểu dữ liệu xác định cách dữ liệu đó được lưu trữ và xử lý.

Định danh (Identifiers)

Định danh là tên được đặt cho các thực thể trong chương trình như biến, hàm, lớp, v.v. Chúng bao gồm một chuỗi ký tự, chữ số và dấu gạch dưới (_). Định danh không được bắt đầu bằng chữ số và không được trùng với các từ khóa của C++ (ví dụ: int, float, class, for, while).

C++ phân biệt chữ hoa và chữ thường. Do đó, myVariable và myvariable là hai định danh khác nhau.

Kiểu Dữ Liệu Cơ Bản

C++ cung cấp các kiểu dữ liệu cơ bản để biểu diễn các loại giá trị khác nhau:

  • Kiểu ký tự: Lưu trữ một ký tự đơn lẻ (ví dụ: char).
  • Kiểu số nguyên: Lưu trữ các số nguyên (ví dụ: int, short, long, long long). Có thể có hoặc không có dấu (signed, unsigned).
  • Kiểu số thực dấu phẩy động: Lưu trữ các số thực (ví dụ: float, double, long double).
  • Kiểu Boolean: Lưu trữ giá trị đúng hoặc sai (bool).
  • Kiểu void: Đại diện cho sự vắng mặt của kiểu dữ liệu.

Bảng dưới tóm tắt các kiểu dữ liệu cơ bản và kích thước tương đối:

Nhóm Tên kiểu Ghi chú về kích thước/độ chính xác
Kiểu ký tự char 1 byte
char16_t Ít nhất 16 bit
char32_t Ít nhất 32 bit
wchar_t Hỗ trợ bộ ký tự lớn
Kiểu số nguyên (có dấu) signed char Ít nhất 8 bit
signed short Ít nhất 16 bit
signed int Ít nhất 16 bit
signed long Ít nhất 32 bit
signed long long Ít nhất 64 bit
Kiểu số nguyên (không dấu) unsigned char (Tương tự kiểu có dấu)
unsigned short
unsigned int
unsigned long
unsigned long long
Kiểu số thực float Độ chính xác đơn
double Độ chính xác kép
long double Độ chính xác mở rộng
Kiểu Boolean bool true hoặc false
Kiểu rỗng void Không chiếm dung lượng

Thông tin chi tiết về kích thước và phạm vi giá trị của các kiểu dữ liệu có thể thay đổi tùy thuộc vào trình biên dịch và kiến trúc hệ thống.

Khai báo Biến

Để khai báo một biến, ta cần chỉ định kiểu dữ liệu và tên của biến.

int soLuong;
double giaTien;

Có thể khai báo nhiều biến cùng kiểu trong một dòng, phân tách bằng dấu phẩy:

int a, b, c;

Khởi tạo Biến

Khởi tạo là việc gán giá trị ban đầu cho biến khi khai báo. Có ba cách khởi tạo phổ biến:

  1. Kiểu C: Sử dụng dấu bằng (=).
    int x = 10;
    
  2. Khởi tạo bộ tạo mẫu: Sử dụng dấu ngoặc đơn (()).
    int y (20);
    
  3. Khởi tạo đồng nhất (C++11 trở đi): Sử dụng dấu ngoặc nhọn ({}).
    int z {30};
    
// Khởi tạo biến
#include <iostream>
using namespace std;

int main ()
{
  int a = 5;      // Khởi tạo bằng '='
  int b(3);       // Khởi tạo bằng '()'
  int c{2};       // Khởi tạo bằng '{}'
  int ketQua;     // Biến chưa được khởi tạo

  a = a + b;
  ketQua = a - c;
  cout << ketQua; // Xuất kết quả: 6
  return 0;
}

Suy luận Kiểu Dữ Liệu: auto và decltype

auto cho phép trình biên dịch tự động suy luận kiểu dữ liệu của biến dựa trên giá trị khởi tạo.

int bienNguyen = 5;
auto bienTuDong = bienNguyen; // bienTuDong sẽ có kiểu int

decltype dùng để khai báo một biến có cùng kiểu dữ liệu với một biểu thức hoặc biến khác.

int bienNguyen = 5;
decltype(bienNguyen) bienKieuTuongTu; // bienKieuTuongTu sẽ có kiểu int

Giới thiệu về Chuỗi (String)

Lớp std::string (cần #include <string>) cho phép lưu trữ và thao tác với các chuỗi ký tự.

#include <iostream>
#include <string> // Bao gồm thư viện string
using namespace std;

int main ()
{
  string chuoiCuaToi; // Khai báo biến chuỗi
  chuoiCuaToi = "Đây là một chuỗi ký tự"; // Gán giá trị
  cout << chuoiCuaToi << endl; // endl xuống dòng

  string chuoiKhac = "Một chuỗi khác."; // Khởi tạo chuỗi
  cout << chuoiKhac << endl;
  return 0;
}

Thẻ: C++ cấu trúc chương trình biến kiểu dữ liệu chú thích

Đăng vào ngày 30 tháng 9 lúc 07:33