⚡ Toán tử trong C++
📖 Giới thiệu
Toán tử (operators) là những ký hiệu đặc biệt được sử dụng để thực hiện các phép toán trên dữ liệu. Chúng là "động từ" trong ngôn ngữ lập trình - cho biết chương trình cần thực hiện hành động gì với các giá trị.
C++ cung cấp nhiều loại toán tử khác nhau: số học (+, -, *, /), so sánh (==, !=, <, >), logic (&&, ||, !), gán (=, +=, -=), và nhiều loại khác. Việc nắm vững các toán tử này là cơ sở để viết được những biểu thức tính toán phức tạp.
Trong bài học này, chúng ta sẽ tìm hiểu từng loại toán tử, cách sử dụng và thứ tự ưu tiên của chúng.
🔧 Cú pháp
Toán tử số học (Arithmetic Operators)
int a = 10, b = 3;
int sum = a + b; // Cộng: 13
int diff = a - b; // Trừ: 7
int product = a * b; // Nhân: 30
int quotient = a / b; // Chia nguyên: 3
int remainder = a % b; // Chia lấy dư: 1
// Toán tử tăng/giảm
a++; // Tăng sau (post-increment)
++a; // Tăng trước (pre-increment)
b--; // Giảm sau (post-decrement)
--b; // Giảm trước (pre-decrement)Toán tử gán (Assignment Operators)
int x = 10; // Gán cơ bản
x += 5; // x = x + 5 (x = 15)
x -= 3; // x = x - 3 (x = 12)
x *= 2; // x = x * 2 (x = 24)
x /= 4; // x = x / 4 (x = 6)
x %= 5; // x = x % 5 (x = 1)Toán tử so sánh (Comparison Operators)
int a = 10, b = 20;
bool equal = (a == b); // Bằng: false
bool notEqual = (a != b); // Khác: true
bool less = (a < b); // Nhỏ hơn: true
bool greater = (a > b); // Lớn hơn: false
bool lessEqual = (a <= b); // Nhỏ hơn hoặc bằng: true
bool greaterEqual = (a >= b); // Lớn hơn hoặc bằng: falseToán tử logic (Logical Operators)
bool p = true, q = false;
bool and_result = p && q; // AND logic: false
bool or_result = p || q; // OR logic: true
bool not_p = !p; // NOT logic: false🔬 Phân tích & Giải thích chi tiết
Thứ tự ưu tiên toán tử
| Mức độ | Toán tử | Mô tả | Ví dụ |
|---|---|---|---|
| 1 | () | Dấu ngoặc | (a + b) * c |
| 2 | ++, -- | Tăng/giảm | ++x, x-- |
| 3 | !, - (unary) | Phủ định, âm | !flag, -x |
| 4 | *, /, % | Nhân, chia, chia dư | a * b / c |
| 5 | +, - | Cộng, trừ | a + b - c |
| 6 | <, >, <=, >= | So sánh | a < b |
| 7 | ==, != | Bằng, khác | a == b |
| 8 | && | AND logic | a && b |
| 9 | ` | ` | |
| 10 | =, +=, -=, ... | Gán | a = b |
Phân biệt ++i và i++
int i = 5;
int a = ++i; // Pre-increment: i tăng trước, rồi gán cho a
// i = 6, a = 6
int j = 5;
int b = j++; // Post-increment: gán j cho b trước, rồi j tăng
// j = 6, b = 5Chia số nguyên vs số thực
// Chia số nguyên - kết quả là số nguyên
int a = 7, b = 3;
int result1 = a / b; // 2 (bỏ phần thập phân)
// Chia số thực - kết quả là số thực
double c = 7.0, d = 3.0;
double result2 = c / d; // 2.33333...
// Ép kiểu để có kết quả thực
double result3 = (double)a / b; // 2.33333...Short-circuit evaluation
bool a = false;
bool b = true;
// Với &&: nếu a = false, không cần kiểm tra b
bool result1 = a && b; // false (chỉ kiểm tra a)
// Với ||: nếu a = true, không cần kiểm tra b
bool result2 = b || a; // true (chỉ kiểm tra b)Toán tử với kiểu dữ liệu khác nhau
// Tự động chuyển đổi kiểu
int i = 10;
double d = 3.5;
double result = i + d; // int → double, kết quả: 13.5
// So sánh ký tự (dựa trên mã ASCII)
char c1 = 'A'; // ASCII: 65
char c2 = 'B'; // ASCII: 66
bool less = (c1 < c2); // true (65 < 66)💻 Ví dụ minh họa
Chương trình máy tính cơ bản
#include <iostream>
using namespace std;
int main() {
double num1, num2;
char operation;
cout << "=== MÁY TÍNH CƠ BẢN ===" << endl;
cout << "Nhập số thứ nhất: ";
cin >> num1;
cout << "Nhập phép toán (+, -, *, /, %): ";
cin >> operation;
cout << "Nhập số thứ hai: ";
cin >> num2;
cout << "\nKết quả: ";
switch (operation) {
case '+':
cout << num1 << " + " << num2 << " = " << (num1 + num2) << endl;
break;
case '-':
cout << num1 << " - " << num2 << " = " << (num1 - num2) << endl;
break;
case '*':
cout << num1 << " * " << num2 << " = " << (num1 * num2) << endl;
break;
case '/':
if (num2 != 0) {
cout << num1 << " / " << num2 << " = " << (num1 / num2) << endl;
} else {
cout << "Lỗi: Không thể chia cho 0!" << endl;
}
break;
case '%':
if (num2 != 0) {
// Ép kiểu về int cho phép chia dư
cout << (int)num1 << " % " << (int)num2 << " = "
<< ((int)num1 % (int)num2) << endl;
} else {
cout << "Lỗi: Không thể chia cho 0!" << endl;
}
break;
default:
cout << "Phép toán không hợp lệ!" << endl;
}
return 0;
}Chương trình kiểm tra số chẵn lẻ
#include <iostream>
using namespace std;
int main() {
int number;
cout << "Nhập một số nguyên: ";
cin >> number;
// Sử dụng toán tử % và ==
bool isEven = (number % 2 == 0);
bool isOdd = !isEven; // Hoặc (number % 2 != 0)
cout << "Số " << number;
if (isEven) {
cout << " là số chẵn" << endl;
} else {
cout << " là số lẻ" << endl;
}
// Cách viết ngắn gọn hơn
cout << "Kết quả khác: " << number << " là số "
<< (isEven ? "chẵn" : "lẻ") << endl;
return 0;
}Chương trình demo thứ tự ưu tiên
#include <iostream>
using namespace std;
int main() {
cout << "=== DEMO THỨ TỰ ƯU TIÊN TOÁN TỬ ===" << endl;
int a = 10, b = 20, c = 30;
// Không có dấu ngoặc
int result1 = a + b * c; // b * c trước, rồi + a
cout << "a + b * c = " << a << " + " << b << " * " << c
<< " = " << result1 << endl; // 10 + 600 = 610
// Có dấu ngoặc
int result2 = (a + b) * c; // (a + b) trước, rồi * c
cout << "(a + b) * c = (" << a << " + " << b << ") * " << c
<< " = " << result2 << endl; // 30 * 30 = 900
// So sánh và logic
bool result3 = a < b && b < c; // a < b trước, rồi b < c, cuối cùng &&
cout << "a < b && b < c = " << boolalpha << result3 << endl; // true
// Toán tử gán có ưu tiên thấp nhất
int x = 5;
int y = x += 3; // x += 3 trước, rồi gán cho y
cout << "int y = x += 3: x = " << x << ", y = " << y << endl; // x = 8, y = 8
return 0;
}Chương trình demo pre/post increment
#include <iostream>
using namespace std;
int main() {
cout << "=== DEMO PRE/POST INCREMENT ===" << endl;
int a = 5, b = 5;
cout << "Giá trị ban đầu: a = " << a << ", b = " << b << endl;
// Pre-increment
cout << "\nPre-increment (++a):" << endl;
cout << "Trước: a = " << a << endl;
cout << "++a = " << ++a << endl; // a tăng trước, rồi trả về giá trị mới
cout << "Sau: a = " << a << endl;
// Post-increment
cout << "\nPost-increment (b++):" << endl;
cout << "Trước: b = " << b << endl;
cout << "b++ = " << b++ << endl; // Trả về giá trị cũ, rồi b mới tăng
cout << "Sau: b = " << b << endl;
// Trong biểu thức phức tạp
int x = 10;
int result1 = x++ + ++x; // (10) + (12) = 22, x cuối cùng = 12
cout << "\nint x = 10;" << endl;
cout << "x++ + ++x = " << result1 << ", x = " << x << endl;
return 0;
}🏋️ Thực hành
Bài tập 1: Máy tính năng lượng
Viết chương trình tính BMR (Base Metabolic Rate):
- Nam: BMR = 88.362 + (13.397 × cân nặng) + (4.799 × chiều cao) - (5.677 × tuổi)
- Nữ: BMR = 447.593 + (9.247 × cân nặng) + (3.098 × chiều cao) - (4.330 × tuổi)
Bài tập 2: Kiểm tra năm nhuận
Năm nhuận thỏa mãn:
- Chia hết cho 4 VÀ (không chia hết cho 100 HOẶC chia hết cho 400)
Bài tập 3: Tìm số lớn nhất
Viết chương trình tìm số lớn nhất trong 3 số mà không dùng if:
- Gợi ý: Sử dụng toán tử điều kiện (ternary operator)
Bài tập 4: Phân tích biểu thức
Tính giá trị của biểu thức sau với a=5, b=10, c=15:
int result = ++a + b++ * --c - a-- / ++b;Lời giải chi tiết
Bài tập 1:
#include <iostream>
using namespace std;
int main() {
double weight, height, age;
char gender;
cout << "Nhập giới tính (M/F): ";
cin >> gender;
cout << "Nhập cân nặng (kg): ";
cin >> weight;
cout << "Nhập chiều cao (cm): ";
cin >> height;
cout << "Nhập tuổi: ";
cin >> age;
double bmr;
if (gender == 'M' || gender == 'm') {
bmr = 88.362 + (13.397 * weight) + (4.799 * height) - (5.677 * age);
} else {
bmr = 447.593 + (9.247 * weight) + (3.098 * height) - (4.330 * age);
}
cout << "BMR của bạn: " << bmr << " calories/ngày" << endl;
return 0;
}Bài tập 2:
#include <iostream>
using namespace std;
int main() {
int year;
cout << "Nhập năm: ";
cin >> year;
bool isLeapYear = (year % 4 == 0) && (year % 100 != 0 || year % 400 == 0);
cout << "Năm " << year << (isLeapYear ? " là" : " không phải")
<< " năm nhuận" << endl;
return 0;
}Bài tập 3:
#include <iostream>
using namespace std;
int main() {
int a, b, c;
cout << "Nhập 3 số: ";
cin >> a >> b >> c;
// Sử dụng toán tử điều kiện
int max = (a > b) ? ((a > c) ? a : c) : ((b > c) ? b : c);
cout << "Số lớn nhất: " << max << endl;
return 0;
}Bài tập 4:
// Phân tích từng bước với a=5, b=10, c=15:
// ++a: a=6, trả về 6
// --c: c=14, trả về 14
// b++: trả về 10, sau đó b=11
// ++b: b=12, trả về 12
// a--: trả về 6, sau đó a=5
// Biểu thức: 6 + 10 * 14 - 6 / 12
// = 6 + 140 - 0 (6/12 = 0 trong phép chia nguyên)
// = 146
int result = 146;📋 Tóm tắt
🎯 Những gì đã học
- Toán tử số học: +, -, *, /, % cho tính toán
- Toán tử gán: =, +=, -=, *=, /=, %= cho gán giá trị
- Toán tử so sánh: ==, !=, <, >, <=, >= cho điều kiện
- Toán tử logic: &&, ||, ! cho logic boolean
- Thứ tự ưu tiên: Dấu ngoặc → Nhân/chia → Cộng/trừ → So sánh → Logic
🔧 Điểm quan trọng cần nhớ
- Phép chia số nguyên cho kết quả nguyên:
7/3 = 2 - Pre-increment vs Post-increment:
++ivsi++ - Short-circuit evaluation:
false && xkhông tính x - Dùng dấu ngoặc để rõ ràng:
(a + b) * c
🚀 Chuẩn bị cho bước tiếp theo
Bài học tiếp theo sẽ tìm hiểu về nhập xuất dữ liệu với cin và cout. Đảm bảo bạn đã:
- [x] Nắm vững các loại toán tử cơ bản
- [x] Hiểu thứ tự ưu tiên toán tử
- [x] Phân biệt được ++i và i++
- [x] Sử dụng được toán tử trong biểu thức phức tạp
💡 Lời khuyên
"Khi viết biểu thức phức tạp, hãy dùng dấu ngoặc để làm rõ ý định. Code rõ ràng quan trọng hơn code ngắn gọn!"
Chuyển sang: Nhập xuất dữ liệu để học cách sử dụng cin, cout và các phương thức I/O khác!