Câu lệnh if trong C cho phép chương trình chọn đường đi dựa trên một điều kiện đúng hay sai. Nhờ đó chương trình không chỉ chạy tuần tự từ trên xuống. Nó còn phản ứng khác nhau theo dữ liệu.
Bài này đi từ cú pháp cơ bản đến if lồng nhau. Ta cũng xem cách kết hợp nhiều điều kiện và những lỗi người mới hay mắc.
Cú pháp if và if-else

#include <stdio.h>
int main(void) {
int diem = 7;
if (diem >= 5) {
printf("Đạt\n");
} else {
printf("Chưa đạt\n");
}
return 0;
}
Biểu thức trong ngoặc được tính trước. Trong C, giá trị khác 0 được coi là đúng và giá trị bằng 0 là sai. C chuẩn cũ không có kiểu boolean riêng. Từ C99, bạn có thể dùng <stdbool.h> để có true và false cho dễ đọc.
Nếu thân của if chỉ có một câu lệnh, bạn có thể bỏ dấu ngoặc nhọn. Tuy nhiên chúng tôi khuyên luôn viết đủ ngoặc. Khi sau này thêm câu lệnh thứ hai, bạn tránh được một cái bẫy. Câu lệnh đó có thể nằm ngoài if dù thụt lề trông như nằm trong.
Chuỗi if-else if

Khi có nhiều khoảng giá trị, ta nối các nhánh bằng else if. C kiểm tra từ trên xuống và chạy nhánh đúng đầu tiên rồi bỏ qua phần còn lại.
int diem = 8;
if (diem >= 9) {
printf("Giỏi\n");
} else if (diem >= 7) {
printf("Khá\n");
} else if (diem >= 5) {
printf("Trung bình\n");
} else {
printf("Yếu\n");
}
Vì chỉ nhánh đúng đầu tiên chạy, nên thứ tự các điều kiện quan trọng. Nếu bạn đặt diem >= 5 lên đầu, mọi điểm từ 5 trở lên đều rơi vào nhánh đó, và các nhánh Giỏi, Khá không bao giờ được chạy.
Kết hợp nhiều điều kiện

Dùng && (và), || (hoặc) và ! (phủ định) để ghép điều kiện.
int tuoi = 20;
int coThe = 1;
if (tuoi >= 18 && coThe) {
printf("Được vào\n");
}
if (tuoi < 6 || tuoi > 60) {
printf("Giảm giá\n");
}
C dùng đánh giá ngắn mạch. Với &&, nếu vế trái đã sai thì vế phải không được tính. Tính chất này giúp tránh lỗi. Chẳng hạn, kiểm tra con trỏ khác NULL trước rồi mới đọc giá trị nó trỏ tới.
If lồng nhau

Bạn có thể đặt if bên trong if khác. Cách này dùng khi điều kiện thứ hai chỉ có nghĩa nếu điều kiện thứ nhất đúng.
int a = 4, b = 0;
if (b != 0) {
if (a % b == 0) {
printf("Chia hết\n");
}
} else {
printf("Không chia được cho 0\n");
}
Lồng quá sâu làm code khó đọc. Nếu thấy mình lồng ba bốn tầng, hãy đảo điều kiện để thoát sớm bằng return hoặc continue. Hoặc gộp các điều kiện bằng toán tử logic.
Những lỗi kinh điển với if trong C
- Dùng
=thay vì==. Câuif (x = 5)gán 5 cho x rồi luôn đúng. Hãy bật cảnh báo-Wallđể trình biên dịch nhắc bạn. - Đặt dấu chấm phẩy ngay sau ngoặc:
if (x > 0);khiến thân if là rỗng và khối phía sau luôn chạy. - So sánh số thực bằng
==. Do sai số làm tròn,0.1 + 0.2 == 0.3cho kết quả sai. Hãy so sánh hiệu với một ngưỡng nhỏ. - Nhầm else treo: else luôn ghép với if gần nhất, không phụ thuộc thụt lề.
Giải pháp thay thế: switch và toán tử ba ngôi
Khi so sánh một biến với nhiều giá trị rời rạc, switch gọn hơn chuỗi else if. Với phép chọn đơn giản, toán tử ba ngôi dieuKien ? a : b rút gọn code thành một dòng. Dù vậy, hãy dùng chúng khi nó làm code dễ đọc hơn, không chỉ vì ngắn.
Câu lệnh điều kiện thường đi cùng vòng lặp. Ví dụ bạn có thể duyệt một dãy số bằng vòng lặp for trong C và dùng if để lọc số chẵn. Nếu bạn chưa cài được trình biên dịch, hãy xem lại bài giới thiệu và cài đặt C. Phần đặc tả ngôn ngữ có thể tra tại cppreference.com.
Hỏi đáp nhanh về if trong C
Nhiều bạn hỏi có thể viết if không có else không. Câu trả lời là được, else hoàn toàn là phần tùy chọn. Khi điều kiện sai và không có else, chương trình đơn giản đi tiếp xuống lệnh sau khối if.
Một câu hỏi khác: nên dùng else if hay nhiều câu if độc lập? Điều này tùy ý đồ của bạn. Với else if, chỉ một nhánh chạy.
Với nhiều if tách rời, mỗi điều kiện đều được kiểm tra, nên có thể nhiều khối cùng chạy. Chọn sai sẽ làm chương trình in ra hai kết quả cho cùng một dữ liệu.
Cuối cùng, hãy tập đặt tên điều kiện bằng biến có nghĩa khi biểu thức dài. Thay vì if (t >= 18 && t < 60 && !hocSinh), bạn viết int tuoiLaoDong = t >= 18 && t < 60; rồi if (tuoiLaoDong && !hocSinh). Code đọc như một câu văn và người sau dễ bảo trì hơn nhiều. Khi duyệt nhiều giá trị, bạn cũng sẽ cần xem cách dùng vòng lặp for trong Java để so sánh cú pháp giữa hai ngôn ngữ.
Bài tập: viết chương trình nhập một năm và báo năm đó có phải năm nhuận không. Điều kiện kết hợp cả chia hết cho 4, không chia hết cho 100, hoặc chia hết cho 400. Vì vậy nó rất hợp để luyện các toán tử logic.



