Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Toán tử 3 ngôi (?:) trong C/C++

Toán tử ? : (ternary/conditional operator) là toán tử duy nhất có 3 toán hạng. Cú pháp: condition ? expr_true : expr_false.

Cú pháp

biểu_thức_điều_kiện ? giá_trị_nếu_true : giá_trị_nếu_false

Ví dụ cơ bản

#include <stdio.h>

int main() {
    int a = -1;
    double b = 26.4231;
    
    // a != 0 (true) -> in b
    int c = a ? printf("True: %lf", b) : printf("False: 0");
    
    return 0;
}

Kết quả

True: 26.423100

Ví dụ so sánh

#include <stdio.h>

int main() {
    int x = -1, y = 3;
    double b = x + y + 0.5; // 2.5
    
    // x < y là true (-1 < 3)
    int c = x < y ? printf("True: %lf", b) : printf("False: 0");
    
    return 0;
}

Kết quả

True: 2.500000

Đặc điểm quan trọng

  • expr1 luôn được đánh giá
  • Chỉ một trong expr2 hoặc expr3 được đánh giá (short-circuit)
  • Có kiểu trả về: kiểu chung của expr2 và expr3 (usual arithmetic conversions)
  • Nếu 2 nhánh không chuyển đổi được nhau → lỗi compile

Ví dụ thực tế

#include <iostream>
using namespace std;

int main() {
    int a = 10, b = 20;
    
    // Gán giá trị
    int max = (a > b) ? a : b;
    cout << "Max: " << max << endl; // 20
    
    // Trong biểu thức
    cout << (a % 2 == 0 ? "Chẵn" : "Lẻ") << endl;
    
    // Lồng nhau (cẩn thận độ đọc)
    int sign = (a > 0) ? 1 : (a < 0) ? -1 : 0;
    
    // Throw trong ternary (C++11)
    int divisor = 0;
    int result = divisor != 0 ? 100 / divisor : throw std::runtime_error("Div by zero");
    
    return 0;
}

Khi nào KHÔNG nên dùng

  • Logic phức tạp, nhiều nhánh → dùng if-else
  • Cần nhiều câu lệnh trong nhánh
  • Giảm độ đọc code (nested ternary)
  • Side effect phức tạp trong nhánh

So sánh với if-else

Đặc điểmTernaryif-else
Là biểu thức (có giá trị)CóKhông (statement)
Gán trực tiếpDễ dàngCần biến tạm
Độ đọc logic phức tạpKémTốt
Hiệu năngGiống nhauGiống nhau