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 :
#include <iostream>
int main()
{
std::cout << "Enter a number: ";
int x;
std::cin >> x;
if (x > 10)
std::cout << x << "is greater than 10\n";
else
std::cout << x << "is not greater than 10\n";
return 0;
}
Nội dung chính
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:
#include <iostream>
int main()
{
std::cout << "Enter a number: ";
int x;
std::cin >> x;
if (x > 10)
{
// both statements will be executed if x > 10
std::cout << "You entered " << x << "\n";
std::cout << x << "is greater than 10\n";
}
else
{
// both statements will be executed if x <= 10
std::cout << "You entered " << x << "\n";
std::cout << x << "is not greater than 10\n";
}
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:
/**
* Cafedev.vn - 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/
*/
#include <iostream>
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:
#include <iostream>
int main()
{
if (true)
{
int x = 5;
} // x destroyed here
else
{
int x = 6;
} // x destroyed here
std::cout << x; // x isn't defined here
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:
#include <iostream>
int main()
{
std::cout << "Enter a number: ";
int x;
std::cin >> x;
if (x > 10)
std::cout << x << "is greater than 10\n";
else if (x < 10)
std::cout << x << "is less than 10\n";
else
std::cout << x << "is exactly 10\n";
return 0;
}
Đoạn code trên thực thi giống hệt như sau (có thể dễ hiểu hơn):
#include <iostream>
int main()
{
std::cout << "Enter a number: ";
int x;
std::cin >> x;
if (x > 10)
std::cout << x << "is greater than 10\n";
else
{
if (x < 10)
std::cout << x << "is less than 10\n";
else
std::cout << x << "is exactly 10\n";
}
return 0;
}
Đầu tiên, x> 10 được đánh giá. Nếu đúng, thì đầu ra của sẽ là “is greater than 10” và chúng ta hoàn thành chương trình. Mặt khác, câu lệnh else thực thi. Câu lệnh else là câu lệnh if lồng nhau. Vì vậy, sau đó chúng tôi kiểm tra xem x <10. Nếu đúng, thì in ra “is less than 10” và thực hiện xong. Mặt khác, câu lệnh else lồng nhau thực thi. Trong trường hợp đó, chúng ta in ra “is exactly 10” và chúng ta đã hoàn thành chương trình.
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:
/**
* Cafedev.vn - 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/
*/
#include <iostream>
int main()
{
std::cout << "Enter a positive number between 0 and 9999: ";
int x;
std::cin >> x;
if (x < 0)
std::cout << x << " is negative\n";
else if (x < 10)
std::cout << x << " has 1 digit\n";
else if (x < 100)
std::cout << x << " has 2 digits\n";
else if (x < 1000)
std::cout << x << " has 3 digits\n";
else if (x < 10000)
std::cout << x << " has 4 digits\n";
else
std::cout << x << " was larger than 9999\n";
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:
#include <iostream>
int main()
{
std::cout << "Enter a number: ";
int x;
std::cin >> x;
if (x >= 10) // outer if statement
// it is bad coding style to nest if statements this way
if (x <= 20) // inner if statement
std::cout << x << "is between 10 and 20\n";
// which if statement does this else belong to?
else
std::cout << x << "is greater than 20\n";
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ồ:
/**
* Cafedev.vn - 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/
*/
#include <iostream>
int main()
{
std::cout << "Enter a number: ";
int x;
std::cin >> x;
if (x >= 10)
{
if (x <= 20)
std::cout << x << "is between 10 and 20\n";
else // attached to inner if statement
std::cout << x << "is greater than 20\n";
}
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:
#include <iostream>
int main()
{
std::cout << "Enter a number: ";
int x;
std::cin >> x;
if (x >= 10)
{
if (x <= 20)
std::cout << x << "is between 10 and 20\n";
}
else // attached to outer if statement
std::cout << x << "is less than 10\n";
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:
/**
* Cafedev.vn - 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/
*/
#include <iostream>
int main()
{
std::cout << "Enter an integer: ";
int x;
std::cin >> x;
std::cout << "Enter another integer: ";
int y;
std::cin >> y;
if (x > 0 && y > 0) // && is logical and -- checks if both conditions are true
std::cout << "both numbers are positive\n";
else if (x > 0 || y > 0) // || is logical or -- checks if either condition is true
std::cout << "One of the numbers is positive\n";
else
std::cout << "Neither number is positive\n";
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:
#include <iostream>
#include <cmath> // for sqrt()
void printSqrt(double value)
{
if (value >= 0.0)
std::cout << "The square root of " << value << " is " << sqrt(value) << "\n";
else
std::cout << "Error: " << value << " is negative\n";
}
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.
/**
* Cafedev.vn - 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/
*/
#include <iostream>
enum class ErrorCode
{
SUCCESS = 0,
NEGATIVE_NUMBER = -1
};
ErrorCode doSomething(int value)
{
// if value is a negative number
if (value < 0)
// early return an error code
return ErrorCode::NEGATIVE_NUMBER;
// Do whatever here
return ErrorCode::SUCCESS;
}
int main()
{
std::cout << "Enter a positive number: ";
int x;
std::cin >> 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)
{
if (x > 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)
{
return (x > y) ? y : x;
}
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.
if (x > 10)
; // this is a null statement
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)
; // the semicolon acts as a null statement
x = 1; // and this line always gets executed!
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:
/**
* Cafedev.vn - 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/
*/
#include <iostream>
int main()
{
std::cout << "Enter 0 or 1: ";
int x;
std::cin >> x;
if (x = 0) // oops, we used an assignment here instead of a test for equality
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ó.
/**
* Cafedev.vn - 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/
*/
#include <iostream>
#include <string>
int main()
{
std::string firstName{};
std::string lastName{};
std::cout << "First name: ";
std::cin >> firstName;
std::cout << "Last name: ";
std::cin >> lastName;
if (std::string fullName{ firstName + ' ' + lastName }; fullName.length() > 20)
{
std::cout << '"' << fullName << "\"is too long!\n";
}
else
{
std::cout << "Your name is " << fullName << '\n';
}
// code that doesn't need @fullName
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.