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
expr1luôn được đánh giá- Chỉ một trong
expr2hoặcexpr3được đánh giá (short-circuit) - Có kiểu trả về: kiểu chung của
expr2và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ểm | Ternary | if-else |
|---|---|---|
| Là biểu thức (có giá trị) | Có | Không (statement) |
| Gán trực tiếp | Dễ dàng | Cần biến tạm |
| Độ đọc logic phức tạp | Kém | Tốt |
| Hiệu năng | Giống nhau | Giống nhau |