Trong C, các biểu thức so sánh được gọi là biểu thức quan hệ, sử dụng các toán tử quan hệ để kiểm tra mối quan hệ giữa các giá trị. Dưới đây là 6 toán tử chính:
>(lớn hơn)<(nhỏ hơn)>=(lớn hơn hoặc bằng)<=(nhỏ hơn hoặc bằng)==(bằng)!=(khác)
Mỗi biểu thức quan hệ trả về giá trị nguyên: 0 (sai) hoặc 1 (đúng). Ví dụ: 15 < 20 cho kết quả 1, trong khi 25 == 10 trả về 0. Chúng thường được dùng trong cấu trúc điều khiển:
if (diemSo >= 85) {
printf("Xếp loại xuất sắc\n");
}
Lưu ý quan trọng: Toán tử == (so sánh) khác với = (gán giá trị). Việc nhầm lẫn có thể dẫn đến lỗi nghiêm trọng:
// Lỗi phổ biến
if (mauSac = 4) { ... }
// Cách phòng tránh
if (4 == mauSac) { ... }
Khi viết mauSac = 4, trình biên dịch sẽ gán giá trị 4 cho biến và coi biểu thức luôn đúng. Cách viết 4 == mauSac giúp phát hiện sớm lỗi cú pháp nếu vô tình dùng =.
Không nối chuỗi toán tử quan hệ: Biểu thức a < b < c không kiểm tra b nằm giữa a và c như mong đợi. Hệ thống sẽ tính (a < b) trước (trả về 0/1), sau đó so sánh kết quả với c. Cách viết đúng:
if (a < b && b < c) {
// Xử lý khi b nằm giữa a và c
}
Thay vì:
// Sai lầm thường gặp
if (10 < tuoi < 60) { ... }
Toán Tử Điều Kiện (Ba Ngôi)
Cấu trúc: biểu_thức_điều_kiện ? giá_trị_nếu_đúng : giá_trị_nếu_sai. Ví dụ chuyển đổi giá trị:
int mucDo = 0;
scanf("%d", &mucDo);
char *ketQua = (mucDo > 7) ? "Cao" : "Thấp";
printf("Mức độ: %s\n", ketQua);
Toán Tử Logic
Ba toán tử chính:
!(phủ định): Chuyển đúng thành sai và ngược lại&&(và): Chỉ đúng khi cả hai toán hạng đều đúng||(hoặc): Đúng khi ít nhất một toán hạng đúng
Ví dụ ứng dụng:
// Kiểm tra mùa hè
int thang;
scanf("%d", &thang);
if (thang == 6 || thang == 7 || thang == 8) {
printf("Mùa hè\n");
}
// Kiểm tra giới tính hợp lệ
int gioiTinh;
scanf("%d", &gioiTinh);
if (gioiTinh == 1 && !daKiemTra) {
printf("Nam chưa xác thực\n");
}
Trong C, mọi giá trị khác 0 được coi là đúng (true), chỉ riêng 0 là sai (false). Điều này ảnh hưởng trực tiếp đến cách đánh giá biểu thức logic.
Ứng Dụng Thực Tế: Xác Minh Độ Tuổi
Bài toán: Kiểm tra người dùng có đủ 18 tuổi để truy cập nội dung không:
int namSinh;
scanf("%d", &namSinh);
int tuoi = 2023 - namSinh;
if (tuoi >= 18 && tuoi <= 120) {
printf("Được phép truy cập\n");
} else {
printf("Truy cập bị từ chối\n");
}
Biểu thức tuoi >= 18 && tuoi <= 120 đảm bảo kiểm tra cả giới hạn dưới và trên, tránh trường hợp người dùng nhập năm sinh không hợp lệ.