Biến và kiểu dữ liệu

Biến

Các biến có thể được sử dụng để thực hiện các thao tác trong lập trình hoặc giải quyết các công thức giống như trong toán học. Tuy nhiên, khác với toán, ta không thể viết các biến một cách tuỳ ý.

Để khai báo một biến trong C++, ta xác định và gán các biến vào các kiểu dữ liệu phù hợp.

Giả sử ta muốn khai báo một biến số nguyên \(x = 5\), ta có thể viết:

int x = 5;

Sau khi khai báo \(x\), ta có thể gán cho \(x\) các giá trị khác:

int x = 5;
int y = 6; // một biến khác
x = y;
x = 2025;
x = 20 * 3 + 4 - 1;

Nếu ta muốn \(x\) không thay đổi khi chạy chương trình, ta có thể khai báo \(x\) là một hằng số.

const int x = 5;

Ta có thể khai báo \(x\) theo cách khác:

int x(5); // cách 1
int x{5}; // cách 2

Ta cũng có thể khai báo \(x\) mà không gán giá trị cho nó.

int x;

Nếu như ta khai báo các biến ở ngoài hàm main, các biến toàn cục (global variable) nếu không gán giá trị sẽ có giá trị bằng \(0\), còn nếu ta khai báo trong các hàm, các biến cục bộ (local variable) sẽ có giá trị ngẫu nhiên.

Kiểu dữ liệu

Ở C++ và các ngôn ngữ lập trình khác, ta có các kiểu dữ liệu cơ bản sau:

Kiểu dữ liệuLoại dữ liệuKích cỡ (bytes)Khoảng giá trị
intSố nguyên \(32\) bit\(4\)\(-2^{31}\) đến \(2^{31} - 1 \)
short intSố nguyên \(16\) bit\(2\)\(-2^{15}\) đến \(2^{15} - 1 \)
long longSố nguyên \(64\) bit\(8\)\(-2^{63}\) đến \(2^{63} - 1 \)
floatSố thực độ chính xác đơn\(4\)\(\approx -3.4 \times 10^{38}\) đến \(\approx 3.4 \times 10^{38}\)
doubleSố thực độ chính xác kép\(8\)\(\approx -1.7 \times 10^{308}\) đến \(\approx 1.7 \times 10^{308}\)
charKí tự\(1\)\(-2^{7}\) đến \(2^{7} - 1\)
boolBoolean\(1\)\(0\) hoặc \(1\)

Kiểu dữ liệu lưu trữ số nguyên

short int, int, long long hoặc long int là các kiểu dữ liệu lưu trữ các số nguyên. Các kiểu dữ liệu này có thể lưu trữ các số nguyên trong khoảng được nói ở bảng trên.

int a = 5;
short int b = -12;
long long c = 1000000000000000ll;

Kiểu dữ liệu lưu trữ số thực

float, double hoặc long double là các kiểu dữ liệu lưu trữ các số thực. Các kiểu dữ liệu này có thể lưu trữ các số thực trong khoảng được nói ở bảng trên.

float c = 12;
double d = 3.1415926;

Ta cần cẩn thận khi so sánh hai số thực. Ví dụ: \(0.1 + 0.2\) sẽ không bằng \(0.3\).

if(0.1 + 0.2 == 0.3){
	cout << "True";
}else cout << "False"; // in "False"

Để khắc phục vấn đề này, ta có thể cho phép chênh lệnh giữa hai số không vượt quá một giới hạn nào đó, ví dụ như \(10^{-6}\).

if(abs((0.1 + 0.2) - 0.3) <= 1e-6){
	cout << "True"; // in "True"
}else cout << "False"; 

Nếu các biến lưu trữ số thực lưu các số nguyên thì nó sẽ cho kết quả chính xác, ví dụ: \(1 + 2 = 3\).

Kiểu dữ liệu lưu trữ kí tự

char lưu trữ kí tự theo bộ mã ASCII.

char a = 'a';
char b = char(98); // 98 trong ASCII là 'b'
char c = char(int('c')); // int() biến đổi kí tự thành chữ số tương ứng trong ASCII 

Kiểu dữ liệu lưu trữ boolean

bool lưu trữ hai giá trị đúng hoặc sai \((0/1)\).

bool a = 0;
bool b = 1;
bool c = (5 < 7); // 5 < 7 đúng -> 1
bool d = !b; // d = 0

auto

Ta có thể sử dụng auto khi khai báo và gán giá trị cho các biến.

auto a = 5; // int
auto b = 3.14; // float

Khi sử dụng auto, ta phải gán giá trị cho biến khi khai báo.

pairtuple

pairtuple được sử dụng để lưu một số dữ liệu vào một biến.

Với pair, ta có thể lưu \(2\) loại giá trị.

pair<int, double> x(3, 3.14); // một pair lưu một `int` và một `double`
cout << x.first << '\n'; // giá trị thứ nhất
cout << x.second << '\n'; // giá trị thứ hai 

pair<int, double> y = make_pair(2, 2.718);
pair<int, int> z;

Với tuple, ta có thể lưu với số lượng tùy ý.

tuple<int, int, int> a(2, 3, 4); // tuple lưu 3 `int`
cout << get<0>(a); // 2
cout << get<1>(a); // 3
cout << get<2>(a); // 4
tuple<int, int, int> b = make_tuple(5, 6, 7);
tuple<bool, bool, bool, bool, bool, bool, bool> notGoodBitset;

tie

Sẽ có lúc ta muốn gán nhiều biến với các giá trị khác nhau.

int a;
double b;
bool c;
// ...
a = 5;
b = 1.414;
c = 0;

Ta có thể sử dụng tie để gán các giá trị này trong một dòng.

int a; 
double b;
bool c;
tie(a, b, c) = make_tuple(5, 1.414, 0);

Từ C++17 trở đi, ta còn có thể khai báo luôn các biến trong một dòng.

auto [a, b, c] = make_tuple(5, 1.414, 0);

Cấu trúc

Nếu không có kiểu dữ liệu nào có thể lưu thông tin mà ta mong muốn, ta có thể tự viết cấu trúc cụ thể giúp lưu những thông tin ấy.