Skip to content

⚡ 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)

cpp
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)

cpp
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)

cpp
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: false

Toán tử logic (Logical Operators)

cpp
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ánha < b
7==, !=Bằng, kháca == b
8&&AND logica && b
9``
10=, +=, -=, ...Gána = b

Phân biệt ++i và i++

cpp
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 = 5

Chia số nguyên vs số thực

cpp
// 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

cpp
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

cpp
// 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

cpp
#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ẻ

cpp
#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

cpp
#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

cpp
#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:

cpp
int result = ++a + b++ * --c - a-- / ++b;

Lời giải chi tiết

Bài tập 1:

cpp
#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:

cpp
#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:

cpp
#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:

cpp
// 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: ++i vs i++
  • Short-circuit evaluation: false && x khô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!

Khóa học C++ miễn phí