Nội dung
1. Variables, Literals và Constants trong C++
Ở mục này, chúng ta sẽ cùng tìm hiểu về Variables (biến), Literals và Constants (hằng số) trong C++ thông qua các ví dụ.
1.1. C++ Variables – Biến
Trong lập trình, biến là một vùng lưu trữ để chứa dữ liệu.
Để chỉ ra vùng lưu trữ, mỗi biến phải được đặt một tên riêng khác nhau (định danh). Ví dụ:
int age = 14;
Tại đây, age là một biến của kiểu dữ liệu int, và tôi đã gán một giá trị nguyên là 14 cho nó.
Note: Kiểu dữ liệu Int đề xuất biến chỉ có thể chứa số nguyên. Tương tự, ta có thể sử dụng kiểu dữ liệu kép nếu cần phải lưu trữ số thập phân và cấp số nhân.
Chúng ta sẽ tìm hiểu chi tiết về tất cả các kiểu dữ liệu trong các hướng dẫn tiếp theo.
Giá trị của một biến có thể được thay đổi, nên tên biến cũng có thể khác nhau.
int age = 14; // age is 14
age = 17; // age is 17
Quy tắc đặt tên biến
- Tên biến chỉ được bao gồm các chữ cái alphabets, số và dấu gạch dưới “_”
- Tên biến không được bắt đầu bằng số
- Tên biến không được bắt đầu bằng ký tự viết hoa
- Một tên biến không thể là một từ khóa. Ví dụ: int là một từ khóa được sử dụng để biểu thị số nguyên
- Tên biến có thể bắt đầu bằng dấu gạch dưới. Tuy nhiên đó không được xem là một tên hay.
Note: Bạn nên đặt tên có ý nghĩa cho các biến. Ví dụ: first_name sẽ tốt hơn là fn.
1.2. C++ Literals
Literals là dữ liệu được dùng để đại diện cho các giá trị cố định. Chúng có thể được sử dụng trực tiếp trong mã code. Ví dụ: 1, 2.5, ‘c’, V.v…
Ở đây, 1, 2.5 và ‘c’ là các literals. Tại sao? Đó là vì bạn không thể gán các giá trị khác cho điều khoản này.
Sau đây là danh sách các literals khác nhau trong lập trình C++.
- Integers – số nguyên
Một integer – số nguyên là một chữ số (được kết hợp bởi các số) mà không có bất kỳ phần phân số hoặc hàm mũ nào. Có ba loại số nguyên trong lập trình C:
- Decimal – Hệ cơ số 10
- Octal – Hệ cơ số 8
- Hexadecimal – Hệ cơ số 16
Ví dụ:
Decimal: 0, -9, 22 etc
Octal: 021, 077, 033 etc
Hexadecimal: 0x7f, 0x2a, 0x521 etc
Trong lập trình C++, Octal bắt đầu với một số 0 và Hexadecimal bắt đầu với 0x.
- Floating-point Literals – Literals kiểu dấu chấm động
Một literal kiểu dấu chấm động là một ký tự số có dạng phân số hoặc dạng lũy thừa. Ví dụ:
-2.0
0.0000234
-0.22E-5
Note: E-5 = 10-5
- Characters – Ký tự
Một ký tự được tạo bằng cách đặt một ký tự bên trong dấu nháy đơn. Ví dụ:‘a’, ‘m’, ‘F’, ‘2’, ‘}’ v.v…
- Escape sequences – Chuỗi ký tự bắt đầu bằng ESC
Đôi khi, việc sử dụng các ký tự không hiển thị hoặc có ý nghĩa đặc biệt là rất cần thiết trong lập trình C++. Ví dụ: dòng mới (Enter), tab, dấu chấm hỏi v.v…
Để sử dụng các ký tự này, chuỗi ký tự bắt đầu bằng ESC sẽ được sử dụng:
Chuỗi ký tự bắt đầu bằng ESC (ESC + …) | Ký tự |
\b | Backspace |
\f | Form feed |
\n | Dòng mới |
\r | Trở lại |
\t | Tab ngang |
\v | Tab dọc |
\\ | Gạch chéo ngược |
\’ | Dấu nháy đơn |
\’’ | Dấu nháy kép |
\? | Dấu chấm hỏi |
\0 | Ký tự rỗng |
- String literals – Literal kiểu chuỗi
String literal là một chuỗi các ký tự được đặt trong dấu ngoặc kép. Ví dụ:
“good” | Hằng chuỗi (không đổi) |
“ ” | Hằng chuỗi rỗng |
“ “ | Hằng chuỗi hoặc 6 khoảng trắng |
“x” | Hằng chuỗi có một ký tự đơn |
“Earth is round/n” | Chuỗi prints với 1 dòng mới |
Chúng ta sẽ tìm hiểu chi tiết hơn về chuỗi ở phần C++ String.
1.3. C++ Constants – Hằng số
Trong C++, chúng ta có thể tạo ra các biến có giá trị không đổi bằng cách sử dụng từ khóa const. Đây là một ví dụ:
const int LIGHT_SPEED = 299792458;
LIGHT_SPEED = 2500 // Error! LIGHT_SPEED is a constant.
Ở đây, tôi đã sử dụng từ khóa const để khai báo một hằng số có tên LIGHT_SPEED. Nếu tôi cố gắng thay đổi giá trị của LIGHT_SPEED, tôi sẽ gặp lỗi.
Một hằng số cũng có thể được tạo ra bằng cách sử dụng chỉ thị tiền xử lý #define. Chúng ta sẽ tìm hiểu chi tiết về nội dung này trong mục C++ Macros.
2. Các kiểu dữ liệu C++
Tiếp theo, chúng ta sẽ cùng tìm hiểu về các kiểu dữ liệu cơ bản như int, float, char, v.v… trong lập trình C++ cũng thông qua các ví dụ.
Trong C++, kiểu dữ liệu dùng để khai báo cho các biến. Việc này giúp xác định loại và kích thước của dữ liệu được liên kết với các biến. Ví dụ:
int age = 13;
Ở đây, age là một biến kiểu int. Có nghĩa là biến chỉ có thể lưu trữ các số nguyên 2 hoặc 4 bytes.
2.1. Các kiểu dữ liệu cơ bản của C++
Bên dưới là bảng tổng hợp các kiểu dữ liệu cơ bản, ý nghĩa và kích thước của từng kiểu dữ liệu (tính bằng byte):
Kiểu dữ liệu | Ý nghĩa | Kích thước (byte) |
int | Số nguyên | 2 hoặc 4 |
float | Số thực (kiểu dấu chấm động) | 4 |
double | Số thực (kiểu dấu chấm động kép) | 8 |
char | Ký tự | 1 |
wchar_t | Ký tự rộng | 2 |
bool | Boolean (dữ liệu có giá trị Đúng/ Sai) | 1 |
void | Rỗng | 0 |
Bây giờ, hãy cùng trao đổi chi tiết hơn về các kiểui dữ liệu cơ bản này.
- C++ int
- Từ khóa int được sử dụng để chỉ số nguyên.
- Kích thước của nó thường là 4 bytes. Nghĩa là int có thể lưu trữ các giá trị từ -2147483648 đến 2147483648.
- Ví dụ:
int salary = 85000;
- C++ float và double
- Float và Double được dùng để lưu trữ các số thực (số thập phân và cấp số nhân).
- Kích thước của Float thường là 4 bytes và của Double là 8 bytes. Do đó, Double có độ chính xác cao gấp 2 lần Float. Để tìm hiểu thêm hãy xem phần C++ Float và Double.
- Ví dụ:
float area = 64.74;
double volume = 134.64534;
Như đã đề cập ở trên, 2 kiểu dữ liệu này cũng được dùng cho cả cấp số nhân. Ví dụ:
double distance = 45E12 // 45E12 is equal to 45*10^12
- C++ char
- Từ khóa char được dùng cho các ký tự.
- Có kích thước 1 byte
- Các ký tự trong C++ được đặt trong dấu nháy đơn ‘ ’.
- Ví dụ:
char test = ‘h’;
Note: Trong C++, một giá trị số nguyên thường được lưu trữ trong biến char thay vì lưu trữ trong ký tự. Để tìm hiểu thêm hãy xem phần C++ Ký tự.
- C++ wchar_t
- Wchar_t cũng gần giống với kiểu dữ liệu char, nhưng kích thước lưu trữ của wchar_t là 2 byte thay vì 1 byte như char.
- Wchar được sử dụng để hiển thị các ký tự cần nhiều bộ nhớ để hiển thị hơn là một char đơn lẻ.
- Ví dụ:
wchar_t test = L’ם’ // storing Hebrew character;
Chú ý ký tự L trước dấu nháy đơn.
Note: Ngoài ra còn có 2 kiểu ký tự với kích thước cố định khác là char16_t và char32_t sẽ được giới thiệu ở phần C++11.
- C++ bool
- Kiểu dữ liệu bool có 1 trong 2 giá trị có thể có là Đúng – True hoặc Sai – False.
- Boolean được sử dụng trong các câu lệnh và vòng lặp có điều kiện (chúng ta sẽ tìm hiểu trong các phần sau).
- Ví dụ:
bool cond = false;
- C++ void
Từ khóa void cho biết về việc không có dữ liệu. Nó có nghĩa là không có gì hoặc không có giá trị.
Ta sẽ sử dụng void khi tìm hiểu về các hàm và con trỏ.
Lưu ý: Bạn không thể khai báo các biến kiểu void.
2.2. Công cụ sửa đổi của C++
Chúng ta có thể sửa đổi thêm một số kiểu dữ liệu cơ bản bằng cách sử dụng công cụ sửa đổi. Có 4 kiểu sửa đổi trong C++, bao gồm:
- Signed
- Unsigned
- Short
- Long
Các kiểu dữ liệu có thể sửa đổi bằng các 4 công cụ ở trên gồm có:
- Int
- Double
- Char
Các loại dữ liệu được sửa đổi trong C++ như sau:
Kiểu dữ liệu | Kích thước (Byte) | Ý nghĩa |
signed int | 4 | Dùng cho số nguyên (tương đương với int) |
unsigned int | 4 | Chỉ có thể lưu trữ số nguyên dương |
short | 2 | Dùng cho số nguyên nhỏ (trong khoảng từ -32768 đến 32767) |
long | Ít nhất 4 | Dùng cho số nguyên lớn (tương đương với long int) |
unsigned long | 4 | Dùng cho số nguyên dương lớn hoặc 0 (tương đương với unsigned long int) |
long long | 8 | Dùng cho số nguyên lớn (tương đương với long long int) |
unsigned long long | 8 | Dùng cho số nguyên dương rất lớn hoặc 0 (tương đương với unsigned long long int) |
long double | 8 | Dùng cho các số có dấu chấm động lớn |
signed char | 1 | Dùng cho các ký tự (phạm vi từ -127 đến 127) |
unsigned char | 1 | Dùng cho các ký tự (phạm vi từ 0 đến 255) |
Hãy xem một số ví dụ sau:
long b = 4523232;
long int c = 2345342;
long double d = 233434.56343;
short d = 3434233; // Error! out of range
unsigned int a = -5; // Error! can only store positive numbers or 0
2.3. Các kiểu dữ liệu có nguồn gốc
Loại dữ liệu có nguồn gốc từ các kiểu dữ liệu cơ bản là loại dẫn xuất. Ví dụ: mảng, con trỏ, kiểu hàm, cấu trúc, v.v…
Chúng ta sẽ tìm hiểu về các kiểu dữ liệu dẫn xuất này trong các hướng dẫn sau.
3. I/O trong C++
Trong mục này, chúng ta sẽ học cách sử dụng đối tượng cin để nhận đầu vào từ người dùng và đối tượng cout để hiển thị đầu ra cho người dùng thông qua các ví dụ.
3.1. C++ Output
Trong C++, đối tượng cout gửi dữ liệu đầu ra đã được định dạng đến các thiết bị đầu ra tiêu chuẩn, chẳng hạn như màn hình. Ta sẽ sử dụng cout cùng với với toán tử << để hiển thị đầu ra output.
Ví dụ 1: Đầu ra dạng chuỗi
#include <iostream>
using namespace std;
int main() {
// prints the string enclosed in double quotes
cout << “This is C++ Programming”;
return 0;
}
Đầu ra
This is C++ Programming
Chương trình này hoạt động như thế nào?
- Đầu tiên, tệp tiêu đề iostream cho phép hiển thị đầu ra.
- Đối tượng cout được định nghĩa bên trong namespace (không gian tên) std. Để sử dụng namespace std, tôi đã dùng câu lệnh using namespace std;
- Mọi chương trình trong C++ đều bắt đầu bằng hàm main() . Việc thực thi mã bắt đầu từ đầu của hàm main().
- Cout là một đối tượng chuỗi được đặt trong dấu ngoặc kép “ ”. Theo đó là toán tử <<
- return 0; là trạng thái thoát của hàm main(). Chương trình kết thúc bằng câu lệnh này, tuy nhiên câu lệnh này không bắt buộc.
Lưu ý: Nếu không dùng câu lệnh using namespace std;, ta cần dùng std::cout thay vì cout
Đây là phương pháp được ưa chuộng vì việc sử dụng namespace std có thể gây ra những vấn đề khác.
Tuy nhiên, tôi đã sử dụng namespace std trong các hướng dẫn của mình để các đoạn code dễ đọc hơn.
#include <iostream>
int main() {
// prints the string enclosed in double quotes
std::cout << “This is C++ Programming”;
return 0;
}
Ví dụ 2: Đầu ra số và ký tự
Để in các biến số và ký tự, tôi sử dụng cùng một đối tượng cout nhưng không sử dụng dấu ngoặc kép.
#include <iostream>
using namespace std;
int main() {
int num1 = 70;
double num2 = 256.783;
char ch = ‘A’;
cout << num1 << endl; // print integer
cout << num2 << endl; // print double
cout << “character: “ << ch << endl; // print char
return 0;
}
Đầu ra
70
256.783
character: A
Lưu ý:
- Trình thao tác endl được dùng để chèn một dòng mới. Đó là lý do khiến mỗi đầu ra được hiển thị trong một dòng mới.
- Toán tử << có thể được sử dụng nhiều lần nếu ta muốn in các biến, chuỗi khác nhau v.v… trong một câu lệnh. Ví dụ:
cout << “character: “ << ch << endl;
3.2. C++ Input
Trong C++, cin nhận đầu vào được định dạng từ các thiết bị đầu vào tiêu chuẩn, như bàn phím. Tôi sử dụng đối tượng cin cùng với toán tử << để lấy đầu vào.
Ví dụ 3: Nhập/ xuất số nguyên
#include <iostream>
using namespace std;
int main() {
int num;
cout << “Enter an integer: “;
cin >> num; // Taking input
cout << “The number is: “ << num;
return 0;
}
Đầu ra
Enter an integer: 70
The number is: 70
Trong chương trình, tôi đã sử dụng cin >> num; để lấy đầu vào từ người dùng. Đầu vào được lưu trữ trong biến num. Và sử dụng toán tử >> với cin để nhận đầu vào.
Lưu ý: Nếu không có câu lệnh using namespace std; thì ta cần sử dụng std::cin thay vì sử dụng cin.
3.3. C++ Multiple inputs
#include <iostream>
using namespace std;
int main() {
char a;
int num;
cout << “Enter a character and an integer: “;
cin >> a >> num;
cout << “Character: “ << a << endl;
cout << “Number: “ << num;
return 0;
}
Đầu ra
Enter a character and an integer: F
23
Character: F
Number: 23
4. Chuyển đổi kiểu dữ liệu trong C++
Tiếp theo, chúng ta sẽ tìm hiểu những thông tin cơ bản về các kiểu chuyển đổi dữ liệu trong C++.
C++ cho phép chúng ta chuyển đổi dữ liệu từ dạng này sang dạng khác. Có 2 loại chuyển đổi dữ liệu trong C++, đó là:
- Implicit convension: Ép kiểu ngầm định
- Explicit convension (hay còn gọi là Type Casting): Ép kiểu tường minh
4.1. Ép kiểu ngầm định
Quá trình chuyển đổi dữ liệu được thực hiện tự động bởi trình biên dịch (compiler) được gọi là ép kiểu ngầm định. Loại chuyển đổi này còn được gọi là chuyển đổi tự động.
Chúng ta hãy xem xét hai ví dụ về chuyển đổi kiểu ngầm định.
Ví dụ 1: Chuyển đổi từ int thành double
// Working of implicit type-conversion
#include <iostream>
using namespace std;
int main() {
// assigning an int value to num_int
int num_int = 9;
// declaring a double type variable
double num_double;
// implicit conversion
// assigning int value to a double variable
num_double = num_int;
cout << “num_int = “ << num_int << endl;
cout << “num_double = “ << num_double << endl;
return 0;
}
Đầu ra
num_int = 9
num_double = 9
Trong chương trình, tôi đã gán dữ liệu int cho một biến double.
num_double = num_int;
Tại đây, giá trị int được trình biên dịch (compiler) tự động chuyển thành double trước khi nó được gán cho biến num_double. Đây là một ví dụ về ép kiểu ngầm định.
Ví dụ 2: Chuyển đổi tự động từ double thành int
//Working of Implicit type-conversion
#include <iostream>
using namespace std;
int main() {
int num_int;
double num_double = 9.99;
// implicit conversion
// assigning a double value to an int variable
num_int = num_double;
cout << “num_int = “ << num_int << endl;
cout << “num_double = “ << num_double << endl;
return 0;
}
Đầu ra
num_int = 9
num_double = 9.99
Trong chương trình, tôi đã gán một dữ liệu double cho một biến int.
num_double = num_int;
Tại đây, giá trị double được trình biên dịch tự động chuyển thành int trước khi nó được gán cho biến num_int. Đây cũng là một ví dụ về ép kiểu ngầm định.
Lưu ý: Vì int không thể chứ phần thập phân nên các chữ số sau dấu thập phân được cắt bớt trong ví dụ trên.
Mất dữ liệu trong quá trình chuyển đổi (Chuyển đổi thu hẹp)
Như chúng ta đã thấy trong ví dụ trên, việc chuyển đổi từ kiểu dữ liệu này sang kiểu dữ liệu khác rất dễ bị mất dữ liệu.
Điều này thường xảy ra khi loại dữ liệu lớn hơn được chuyển đổi thành loại dữ liệu nhỏ hơn.
https://cdn.programiz.com/sites/tutorial2program/files/cpp-type-conversion.png
4.2. Ép kiểu tường minh
Quá trình người dùng thay đổi dữ liệu từ loại này sang loại khác bằng cách thủ công được gọi là ép kiểu tường minh.
Có 3 cách chính mà ta có thể sử dụng ép kiểu tường minh, đó là:
- C-style type casting (hay cast notation)
- Function notation (hay C-style type casting kiểu cũ)
- Type conversion operators
C-style type casting – Chuyển đổi kiểu C
Như tên gọi của chính nó, ép kiểu theo cách này rất được ưa chuộng bởi ngôn ngữ lập trình C. Loại hình này cũng được biết đến với tên gọi khác là cast notation.
Cú pháp của loại hình này là:
(data_type)expression;
Ví dụ 1:
// initializing int variable
int num_int = 26;
// declaring double variable
double num_double;
// converting from int to double
num_double = (double)num_int;
Function-style casting – Chuyển đổi bằng hàm
Chúng ta cũng có thể sử dụng hàm như ký hiệu để truyền dữ liệu từ kiểu này sang kiểu khác.
Cú pháp của loại hình này là:
(data_type)expression;
Ví dụ 2:
// initializing int variable
int num_int = 26;
// declaring double variable
double num_double;
// converting from int to double
num_double = double(num_int);
Ví dụ 3: Type casting
#include <iostream>
using namespace std;
int main() {
// initializing a double variable
double num_double = 3.56;
cout << “num_double = “ << num_double << endl;
// C-style conversion from double to int
int num_int1 = (int)num_double;
cout << “num_int1 = “ << num_int1 << endl;
// function-style conversion from double to int
int num_int2 = int(num_double);
cout << “num_int2 = “ << num_int2 << endl;
return 0;
}
Đầu ra
num_double = 3.56
num_int1 = 3
num_int2 = 3
Tôi đã sử dụng cả chuyển đổi kiểu C (C-style) và kiểu hàm (function-style) để chuyển đổi dữ liệu và hiển thị kết quả. Vì 2 cách chuyển đổi đều thực hiện cùng một nhiệm vụ nên cả 2 đều cho chúng ta một đầu ra.
Type conversion operators – Chuyển đổi toán tử
Bên cạnh 2 loại hình trên, C++ cũng có 4 toán tử cho chuyển đổi dữ liệu, được gọi là toán tử chuyển đổi. Bao gồm:
- static_cast
- dynamic_cast
- const_cast
- reinterpret_cast
Chúng ta sẽ tìm hiểu thêm ở những hướng dẫn sau.
5. Toán tử trong C++
Trong lập trình, toán tử là một ký hiệu hoạt động trên một giá trị hoặc một biến. Toán tử còn là các ký hiệu thực hiện các thao tác trên các biến và giá trị.
Ví dụ: + là một toán tử được sử dụng để cộng, trong khi – là một toán tử được sử dụng để trừ.
Các toán tử trong C++ có thể được phân thành 6 loại:
- Toán tử số học
- Toán tử gán
- Toán tử quan hệ
- Toán tử logic
- Toán tử Bitwise
- Toán tử khác
Chúng ta hãy cùng đi tìm hiểu chi tiết về các loại toán tử này:
5.1. Toán tử số học
Các toán tử số học được sử dụng để thực hiện các phép toán số học trên các biến và dữ liệu. Ví dụ:
a + b;
Ở ví dụ này, toán tử + được dùng để cộng 2 biến a và b. Tương tự, có rất nhiều toán tử số học khác trong C++.
Toán tử | Chức năng |
+ | Cộng |
– | Trừ |
* | Nhân |
/ | Chia |
% | Phép toán modulo (tìm số dư của phép chia) |
Ví dụ 1: Toán tử số học
#include <iostream>
using namespace std;
int main() {
int a, b;
a = 7;
b = 2;
// printing the sum of a and b
cout << “a + b = “ << (a + b) << endl;
// printing the difference of a and b
cout << “a – b = “ << (a – b) << endl;
// printing the product of a and b
cout << “a * b = “ << (a * b) << endl;
// printing the division of a by b
cout << “a / b = “ << (a / b) << endl;
// printing the modulo of a by b
cout << “a % b = “ << (a % b) << endl;
return 0;
}
Đầu ra
a + b = 9
a – b = 5
a * b = 14
a / b = 3
a % b = 1
Ở đây, các toán tử +, – và * tính toán các phép tính cộng, trừ và nhân tương ứng như chúng ta có thể mong đợi. Tuy nhiên toán tử chia và modulo lại có sự khác biệt nhỏ.
Toán tử chia
Toán tử / được dùng cho phép tính chia. Như chúng ta đã thấy từ ví dụ trên, nếu một số nguyên chia cho một số nguyên khác, chúng ta sẽ nhận được thương số. Tuy nhiên, nếu số bị chia hoặc số chia là một số có dấu chấm động, ta sẽ nhận được kết quả là số thập phân.
In C++,
7/2 is 3
7.0 / 2 is 3.5
7 / 2.0 is 3.5
7.0 / 2.0 is 3.5
Toán tử % Modulo
Toán tử modulo % dùng để tính số dư. Khi a=9 chia cho b=4 thì số dư là 1.
Lưu ý: Toán tử % chỉ có thể được sử dụng với số nguyên.
Toán tử tăng và giảm
C++ cũng cung cấp các toán tử tăng và giảm tương ứng với ++ và –. ++ làm tăng giá trị của toán hạng lên 1 và — làm giảm đi 1 giá trị.
Ví dụ:
int num = 5;
// increasing num by 1
++num;
Ở đây, giá trị của num được tăng lên thành 6 từ giá trị 5 ban đầu.
Ví dụ 2: Toán tử tăng và giảm
// Working of increment and decrement operators
#include <iostream>
using namespace std;
int main() {
int a = 10, b = 100, result_a, result_b;
// incrementing a by 1 and storing the result in result_a
result_a = ++a;
cout << “result_a = “ << result_a << endl;
// decrementing b by 1 and storing the result in result_b
result_b = –b;
cout << “result_b = “ << result_b << endl;
return 0;
}
Đầu ra
result_a = 11
result_b = 99
Trong chương trình trên, tôi đã sử dụng toán tử ++ và — làm tiền tố. Ta cũng có thể sử dụng các toán tử này như hậu tố.
Tuy nhiên có một chút khác biệt khi sử dụng toán từ này như một tiền tố so với khi sử dụng như một hậu tố.
5.2. Toán tử gán
Trong C++, toán tử gán được sử dụng để gán giá trị cho các biến. Ví dụ:
// assign 5 to a
a = 5;
Ở đây, tôi đã gán giá trị 5 cho biến a.
Toán tử | Ví dụ | Tương ứng với |
= | a=b; | a=b; |
+= | a+=b; | a=a+b; |
-= | a-=b; | a=a-b |
*= | a*=b; | a=a*b; |
/= | a/=b; | a=a/b; |
%= | a%=b; | a=a%b; |
Ví dụ 3: Toán tử gán
#include <iostream>
using namespace std;
int main() {
int a, b, temp;
// 2 is assigned to a
a = 2;
// 7 is assigned to b
b = 7;
// value of a is assigned to temp
temp = a; // temp will be 2
cout << “temp = “ << temp << endl;
// assigning the sum of a and b to a
a += b; // a = a +b
cout << “a = “ << a << endl;
return 0;
}
Đầu ra
temp = 2
a = 9
5.3. Toán tử quan hệ
Một toán tử quan hệ được sử dụng để kiểm tra mối quan hệ giữa hai toán hạng. Ví dụ:
// checks if a is greater than b
a > b;
Ở đây, > là một toán tử quan hệ. Toán tử này dùng để kiểm tra xem a có lớn hơn b hay không.
Nếu quan hệ là đúng, kết quả sẽ trả về 1, còn nếu quan hệ là sai, kết quả sẽ trả về 0.
Toán tử | Ý nghĩa | Ví dụ |
== | bằng | 3==5 cho kết quả False |
!= | Không bằng | 3!=5 cho kết quả True |
> | Lớn hơn | 3>5 cho kết quả False |
< | Nhỏ hơn | 3<5 cho kết quả True |
>= | Lớn hơn hoặc bằng | 3>=5 cho kết quả False |
<= | Nhỏ hơn hoặc bằng | 3<=5 cho kết quả True |
Ví dụ 4: Toán tử quan hệ
#include <iostream>
using namespace std;
int main() {
int a, b;
a = 3;
b = 5;
bool result;
result = (a == b); // false
cout << “3 == 5 is “ << result << endl;
result = (a != b); // true
cout << “3 != 5 is “ << result << endl;
result = a > b; // false
cout << “3 > 5 is “ << result << endl;
result = a < b; // true
cout << “3 < 5 is “ << result << endl;
result = a >= b; // false
cout << “3 >= 5 is “ << result << endl;
result = a <= b; // true
cout << “3 <= 5 is “ << result << endl;
return 0;
}
Đầu ra
3 == 5 is 0
3 != 5 is 1
3 > 5 is 0
3 < 5 is 1
3 >= 5 is 0
3 <= 5 is 1
Lưu ý rằng các toán tử quan hệ được sử dụng trong việc đưa ra quyết định và vòng lặp.
5.4. Toán tử logic
Toán tử logic được dùng để kiểm tra xem một biểu thức là đúng hay sai. Nếu biểu thức đúng, kết quả sẽ trả về 1, còn nếu biểu thức sai, kết quả sẽ trả về 0.
Toán tử | Ví dụ | Ý nghĩa |
&& | Biểu thức 1 && biểu thức 2 | AND
Chỉ đúng nếu tất cả toán hạng đều đúng |
|| | Biểu thức 1 || biểu thức 2 | OR
Đúng nếu có ít nhất một toán hạng đúng |
! | !Biểu thức | NOT
Đúng nếu toán hạng sai |
Trong C++, toán tử logic thường được sử dụng để đưa ra quyết định. Để hiểu rõ hơn về toán tử logic, ta hãy cùng xem ví dụ bên dưới:
Suppose,
a = 5
b = 8
Then,
(a > 3) && (b > 5) evaluates to true
(a > 3) && (b < 5) evaluates to false
(a > 3) || (b > 5) evaluates to true
(a > 3) || (b < 5) evaluates to true
(a < 3) || (b < 5) evaluates to false
!(a == 3) evaluates to true
!(a > 3) evaluates to false
Ví dụ 5: Toán tử logic
#include <iostream>
using namespace std;
int main() {
bool result;
result = (3 != 5) && (3 < 5); // true
cout << “(3 != 5) && (3 < 5) is “ << result << endl;
result = (3 == 5) && (3 < 5); // false
cout << “(3 == 5) && (3 < 5) is “ << result << endl;
result = (3 == 5) && (3 > 5); // false
cout << “(3 == 5) && (3 > 5) is “ << result << endl;
result = (3 != 5) || (3 < 5); // true
cout << “(3 != 5) || (3 < 5) is “ << result << endl;
result = (3 != 5) || (3 > 5); // true
cout << “(3 != 5) || (3 > 5) is “ << result << endl;
result = (3 == 5) || (3 > 5); // false
cout << “(3 == 5) || (3 > 5) is “ << result << endl;
result = !(5 == 2); // true
cout << “!(5 == 2) is “ << result << endl;
result = !(5 == 5); // false
cout << “!(5 == 5) is “ << result << endl;
return 0;
}
Đầu ra
(3 != 5) && (3 < 5) is 1
(3 == 5) && (3 < 5) is 0
(3 == 5) && (3 > 5) is 0
(3 != 5) || (3 < 5) is 1
(3 != 5) || (3 > 5) is 1
(3 == 5) || (3 < 5) is 0
!(5 == 2) is 1
!(5 == 5) is 0
Để các bạn có thể hiểu thêm về toán tử logic trên, tôi sẽ giải thích ý nghĩa của chương trình:
-
- (3 != 5) && (3 < 5) cho giá trị bằng 1 vì cả toán hạng (3 != 5) và (3 < 5) đều là 1 (Đúng)
- (3 == 5) && (3 < 5) cho giá trị bằng 0 vì toán hạng (3 == 5) bằng 0 (Sai)
- (3 == 5) && (3 > 5)cho giá trị bằng 0 vì cả toán hạng (3 == 5)và (3 > 5) đều bằng 0 (Sai)
- (3 != 5) || (3 < 5) cho giá trị bằng 1 vì cả toán hạng (3 != 5) và (3 < 5) đều bằng 1 (Đúng)
- (3 != 5) || (3 > 5) cho giá trị bằng 1 vì toán hạng (3 != 5)bằng 1 (Đúng)
- (3 == 5) || (3 > 5) cho giá trị bằng 0 vì cả toán hạng (3 == 5)và (3 > 5) đều bằng 0 (Sai)
- !(5 == 2) cho giá trị bằng 1 vì toán hạng (5 == 2) bằng 0 (Sai)
- !(5 == 5) cho giá trị bằng 0 vì toán hạng (5 == 5) bằng 1 (Đúng)
5.5. Toán tử bitwise
Trong C++, toán tử bitwise được sử dụng để thực hiện hoạt động trên các bit riêng lẻ. Tuy nhiên toán tử này chỉ có thể được sử dụng cùng với các kiểu dữ liệu char và int.
Toán tử | Mô tả |
& | Nhị phân AND |
| | Nhị phân OR |
^ | Nhị phân XOR |
~ | Nhị phân Bù 1 |
<< | Nhị phân Shift left |
>> | Nhị phân Shift right |
Ngoài các toán tử đã được đề cập ở trên, có một số toán tử khác như sizeof, ?, ., &, etc., không thể phân loại thành một loại xác định.
6. C++ Comments
Bây giờ, ta sẽ tìm hiểu về các chú thích trong C++, tại sao ta cần sử dụng và cách sử dụng như thế nào.
Chú thích trong C++ là những gợi ý mà một lập trình viên có thể thêm vào để làm cho code của họ dễ đọc và dễ hiểu hơn. Các chú thích này hoàn toàn bị trình biên dịch C++ bỏ qua.
Có 2 cách để thêm chú thích vào code:
// Chú thích dòng đơn
/* */ Chú thích nhiều dòng
6.1. Chú thích dòng đơn
Trong C++, bất kỳ dòng nào bắt đầu với // đều là chú thích. Ví dụ:
// declaring a variable
int a;
// initializing the variable ‘a’ with the value 2
a = 2;
Ở đây, tôi đã dùng 2 dòng đơn chú thích:
- // declaring a variable
- // initializing the variable ‘a’ with the value 2
Ta cũng có sử dụng một dòng đơn bình luận như sau:
int a; // declaring a variable
6.2. Chú thích nhiều dòng
Trong C++, bất cứ dòng nào nằm giữa /* và */ đều là chú thích. Ví dụ:
/* declaring a variable
to store salary to employees
*/
int salary = 2000;
Cú pháp này có thể được sử dụng để viết cả chú thích một dòng và nhiều dòng.
Sử dụng chú thích để chữa lỗi
Chú thích cũng có thể được sử dụng để vô hiệu hóa mã, ngăn mã được thực thi. Ví dụ:
#include <iostream>
using namespace std;
int main() {
cout << “some code”;
cout << ”error code;
cout << “some other code”;
return 0;
}
Nếu gặp lỗi khi chạy chương trình, thay vì xóa mã dễ bị lỗi, tôi có thể sử dụng các chú thích để vô hiệu hóa mã không thực thi, đây có thể là một công cụ gỡ lỗi có giá trị.
#include <iostream>
using namespace std;
int main() {
cout << “some code”;
// cout << ”error code;
cout << “some other code”;
return 0;
}
Pro tip: Hãy ghi nhớ phím tắt để dùng chú thích thật sự rất hữu ích. Đối với hầu hết các trình soạn thảo mã, phím tắt đó là Ctrl + / cho Windows và Cmd + / cho Mac.
Tại sao sử dụng chú thích?
Nếu viết nhận chú thích trên đoạn code của mình, ta sẽ dễ dàng hiểu code hơn trong tương lai. Ngoài ra, các nhà đồng nghiệp của bạn cũng sẽ hiểu mã dễ dàng hơn.
Lưu ý: Chú thích không nên thay thế cho cách giải thích mã viết kém bằng tiếng Anh. ta nên viết mã có cấu trúc tốt và tự giải thích. Sau đó sử dụng thêm chú thích.
Theo nguyên tắc chung, hãy sử dụng các chú thích để giải thích tại sao bạn đã làm điều đó thay vì trình bày cách bạn đã làm điều gì đó và thể hiện là bạn giỏi.