Loại cơ bản nhất của việc rẻ nhánh có điều kiện trong C ++ là câu lệnh if . Một câu lệnh if có dạng:
if (expression) statement or if (expression) statement else statement2
Biểu thức(expression) được gọi là biểu thức điều kiện. Nếu biểu thức ước lượng là true (khác không), câu lệnh(statement) sẽ thực thi. Nếu biểu thức ước lượng thành false, câu lệnh(statement) sau else sẽ được thực thi nếu nó tồn tại.
Đây là một chương trình đơn giản sử dụng câu lệnh if :
int main() { std::cout << “Enter a number: “; int x;
std::cout << x << “is greater than 10n”; else std::cout << x << “is not greater than 10n”;
return 0; }
1. Sử dụng câu lệnh if với một khối lệnh
Lưu ý rằng câu lệnh if chỉ thực thi một câu lệnh nếu biểu thức là đúng và câu lệnh else chỉ thực thi một câu lệnh nếu biểu thức là sai. Để thực thi nhiều câu lệnh, chúng ta có thể sử dụng một khối lệnh:
int main() { std::cout << “Enter a number: “; int x;
{ std::cout << “You entered ” << x << “n”; std::cout << x << “is greater than 10n”; } else { std::cout << “You entered ” << x << “n”; std::cout << x << “is not greater than 10n”; }
return 0; }
2. Khối lệnh ẩn
Nếu lập trình viên không khai báo một khối lệnh trong phần câu lệnh của câu lệnh if hoặc câu lệnh else , trình biên dịch sẽ ngầm khai báo một khối lệnh ẩn. Như vậy:
if (expression) statement else statement2
thực sự là tương đương với:
if (expression) { statement } else { statement2 }
Hầu hết thời gian, điều này không quan trọng. Tuy nhiên, các lập trình viên mới đôi khi cố gắng làm một cái gì đó như thế này:
/** * chúng tôi - Kênh thông tin IT hàng đầu Việt Nam * * @author cafedevn * Contact: cafedevn@gmail.com * Fanpage: https://www.facebook.com/cafedevn * Instagram: https://instagram.com/cafedevn * Twitter: https://twitter.com/CafedeVn * Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/ */ int main() { if (true) int x = 5; else int x = 6; std::cout << x; return 0; }
Điều này sẽ không được biên dịch, trình biên dịch sẽ tạo ra lỗi mà định danh x không được khai báo. Điều này là do ví dụ trên tương đương với:
int main() { if (true) { int x = 5; } else { int x = 6; }
std::cout << x;
return 0; }
Trong bối cảnh này, rõ ràng hơn rằng biến x chỉ có phạm vi trong một khối mà nó khái báo thôi và bị phá hủy ở cuối khối. Vào thời điểm chúng ta đến dòng std :: cout, x không tồn tại.
3. Một chuỗi câu lệnh if else
Có thể xâu chuỗi các câu lệnh if-else lại với nhau:
int main() { std::cout << “Enter a number: “; int x;
std::cout << x << “is greater than 10n”; else if (x < 10) std::cout << x << “is less than 10n”; else std::cout << x << “is exactly 10n”;
return 0; }
Đoạn code trên thực thi giống hệt như sau (có thể dễ hiểu hơn):
int main() { std::cout << “Enter a number: “; int x;
std::cout << x << “is greater than 10n”; else { if (x < 10) std::cout << x << “is less than 10n”; else std::cout << x << “is exactly 10n”; }
return 0; }
Trong thực tế, chúng ta thường không lồng các chuỗi if else bên trong các khối, bởi vì nó làm cho các câu lệnh khó đọc hơn.
Đây là một ví dụ khác:
/** * chúng tôi - Kênh thông tin IT hàng đầu Việt Nam * * @author cafedevn * Contact: cafedevn@gmail.com * Fanpage: https://www.facebook.com/cafedevn * Instagram: https://instagram.com/cafedevn * Twitter: https://twitter.com/CafedeVn * Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/ */ int main() { std::cout << "Enter a positive number between 0 and 9999: "; int x; if (x < 0) std::cout << x << " is negativen"; else if (x < 10) std::cout << x << " has 1 digitn"; else if (x < 100) std::cout << x << " has 2 digitsn"; else if (x < 1000) std::cout << x << " has 3 digitsn"; else if (x < 10000) std::cout << x << " has 4 digitsn"; else std::cout << x << " was larger than 9999n"; return 0; }
4. Câu lệnh if Lồng nhau
Cũng có thể lồng các câu lệnh if với nhau:
int main() { std::cout << “Enter a number: “; int x;
if (x <= 20) std::cout << x << “is between 10 and 20n”;
else std::cout << x << “is greater than 20n”;
return 0; }
Chương trình trên giới thiệu một đoạn code mơ hồ.
Để tránh sự mơ hồ như vậy khi lồng các câu lệnh phức tạp, nói chung nên bao gồm câu lệnh trong một khối. Đây là chương trình trên được viết mà không mơ hồ:
/** * chúng tôi - Kênh thông tin IT hàng đầu Việt Nam * * @author cafedevn * Contact: cafedevn@gmail.com * Fanpage: https://www.facebook.com/cafedevn * Instagram: https://instagram.com/cafedevn * Twitter: https://twitter.com/CafedeVn * Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/ */ int main() { std::cout << "Enter a number: "; int x; { if (x <= 20) std::cout << x << "is between 10 and 20n"; else std::cout << x << "is greater than 20n"; } return 0; }
Bây giờ thì rõ ràng hơn rằng câu lệnh if có một khối lệnh if bên trong.
Việc code hóa câu lệnh if bên trong trong một khối cũng cho phép chúng ta đính kèm một cách rõ ràng một câu lệnh else vào câu lệnh if bên ngoài:
int main() { std::cout << “Enter a number: “; int x;
{ if (x <= 20) std::cout << x << “is between 10 and 20n”; } else std::cout << x << “is less than 10n”;
return 0; }
Việc sử dụng một khối sẽ báo cho trình biên dịch rằng câu lệnh else sẽ đính kèm với câu lệnh if trước khối. Nếu không có khối, câu lệnh else sẽ đính kèm vào câu lệnh if chưa từng có gần nhất, đó sẽ là câu lệnh if bên trong.
5. Sử dụng toán tử logic với câu lệnh if
Bạn cũng có thể gộp nhiều điều kiện kiểm tra cùng nhau bằng cách sử dụng các toán tử logic:
/** * chúng tôi - Kênh thông tin IT hàng đầu Việt Nam * * @author cafedevn * Contact: cafedevn@gmail.com * Fanpage: https://www.facebook.com/cafedevn * Instagram: https://instagram.com/cafedevn * Twitter: https://twitter.com/CafedeVn * Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/ */ int main() { std::cout << "Enter an integer: "; int x; std::cout << "Enter another integer: "; int y; std::cout << "both numbers are positiven"; std::cout << "One of the numbers is positiven"; else std::cout << "Neither number is positiven"; return 0; }
6. Câu lệnh if thường dùng làm gì?
Câu lệnh if thường được sử dụng để kiểm tra lỗi. Ví dụ: để tính căn bậc hai, giá trị được truyền cho hàm căn bậc hai phải là số không âm:
void printSqrt(double value) { std::cout << “The square root of ” << value << ” is ” << sqrt(value) << “n”; else std::cout << “Error: ” << value << ” is negativen”; }
Câu lệnh if cũng có thể được sử dụng để thực hiện trả về sớm , trong đó một hàm trả lại quyền điều khiển cho người gọi trước khi kết thúc hàm. Trong chương trình sau, nếu giá trị tham số là âm, hàm sẽ trả về một code lỗi không đổi hoặc enum cho người gọi ngay lập tức.
/** * chúng tôi - Kênh thông tin IT hàng đầu Việt Nam * * @author cafedevn * Contact: cafedevn@gmail.com * Fanpage: https://www.facebook.com/cafedevn * Instagram: https://instagram.com/cafedevn * Twitter: https://twitter.com/CafedeVn * Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/ */ enum class ErrorCode { SUCCESS = 0, NEGATIVE_NUMBER = -1 }; ErrorCode doSomething(int value) { if (value < 0) return ErrorCode::NEGATIVE_NUMBER; return ErrorCode::SUCCESS; } int main() { std::cout << "Enter a positive number: "; int x; if (doSomething(x) == ErrorCode::NEGATIVE_NUMBER) { std::cout << "You entered a negative number!n"; } else { std::cout << "It worked!n"; } return 0; }
Câu lệnh if cũng thường được sử dụng để thực hiện chức năng toán học đơn giản, chẳng hạn như hàm min () hoặc max () trả về số tối thiểu hoặc số tối đa của các tham số:
int min(int x, int y) { return y; else return x; }
Lưu ý rằng hàm cuối cùng này rất đơn giản, nó cũng có thể được viết bằng toán tử có điều kiện (? :):
int min(int x, int y) { }
7. Câu lệnh if rỗng
Có thể bỏ qua phần câu lệnh của câu lệnh if . Một câu lệnh không có phần thân được gọi là một câu lệnh rỗng và nó được khai báo bằng cách sử dụng một dấu chấm phẩy duy nhất thay cho câu lệnh. Đối với mục đích dễ đọc, dấu chấm phẩy của câu lệnh rỗng thường được đặt trên dòng riêng của nó. Điều này cho thấy rằng việc sử dụng câu lệnh rỗng là có chủ ý và làm cho việc bỏ qua việc sử dụng câu lệnh rỗng trở nên khó khăn hơn.
;
Các câu lệnh rỗng thường được sử dụng khi lập trình viên không cần một câu lệnh nào đó. Chúng ta sẽ thấy các ví dụ về các câu lệnh rỗng cố ý sau trong chương này
Câu lệnh rỗng hiếm khi được sử dụng kết hợp với câu lệnh if . Tuy nhiên, họ thường vô tình gây ra vấn đề cho các lập trình viên mới hoặc bất cẩn. Hãy xem xét đoạn trích sau:
if (x == 0); x = 1;
Trong đoạn trích trên, người dùng vô tình đặt dấu chấm phẩy vào cuối câu lệnh if . Lỗi không đáng kể này thực sự khiến đoạn mã trên thực thi như thế này:
if (x == 0) ; x = 1;
Cảnh báo: Hãy chắc chắn rằng bạn không vô tình làm chấm dứt việc chấm dứt các câu lệnh if của bạn bằng dấu chấm phẩy.
8. Toán tử == vs Toán tử = bên trong điều kiện
Nếu bên trong câu lệnh if của bạn có điều kiện, bạn nên sử dụng toán tử == khi kiểm tra tính bằng, không phải toán tử = (đó là phép gán). Hãy xem xét chương trình sau:
/** * chúng tôi - Kênh thông tin IT hàng đầu Việt Nam * * @author cafedevn * Contact: cafedevn@gmail.com * Fanpage: https://www.facebook.com/cafedevn * Instagram: https://instagram.com/cafedevn * Twitter: https://twitter.com/CafedeVn * Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/ */ int main() { std::cout << "Enter 0 or 1: "; int x; if (x = 0) std::cout << "You entered 0"; else std::cout << "You entered 1"; return 0; }
Chương trình này sẽ biên dịch và chạy, nhưng sẽ luôn tạo ra kết quả. Vì điều kiện luôn luôn là sai, nên câu lệnh else luôn luôn thực thi.
9. Khởi tạo biến trong câu lệnh if
Nếu bạn cần một biến trong câu lệnh if, nhưng không phải bên ngoài câu lệnh đó, bạn có thể khai báo một biến với giá trị nào đó, rồi sau đó kiểm tra nó.
/** * chúng tôi - Kênh thông tin IT hàng đầu Việt Nam * * @author cafedevn * Contact: cafedevn@gmail.com * Fanpage: https://www.facebook.com/cafedevn * Instagram: https://instagram.com/cafedevn * Twitter: https://twitter.com/CafedeVn * Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/ */ int main() { std::string firstName{}; std::string lastName{}; std::cout << "First name: "; std::cout << "Last name: "; { std::cout << '"' << fullName << ""is too long!n"; } else { std::cout << "Your name is " << fullName << 'n'; } return 0; }
fullName có thể truy cập trong toàn bộ câu lệnh if , bao gồm cả phần thân của nó. câu lệnh init-statement đã được thêm vào ngôn ngữ trong C ++ 17.