[Tự học C++] Câu lệnh If trong C++ » Cafedev.vn

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;
}

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: [email protected]
* 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: [email protected]
* 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: [email protected]
* 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: [email protected]
* 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: [email protected]
* 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: [email protected]
* 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: [email protected]
* 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.

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!