1. Toán tử dấu phẩy

Toán tửký hiệuFormHoạt động
Dấu phẩy,x, yĐánh giá x rồi đến y, trả về giá trị của y

Toán tử dấu phẩy (,) cho phép bạn đánh giá nhiều biểu thức ở bất kỳ nơi nào cho phép một biểu thức duy nhất. Toán tử dấu phẩy đánh giá toán hạng bên trái, sau đó là toán hạng bên phải, rồi trả về kết quả của toán hạng bên phải.

Ví dụ:

#include <iostream>
 
int main()
{
    int x{ 1 };
    int y{ 2 };
 
    std::cout << (++x, ++y); // increment x and y, evaluates to the right operand
 
    return 0;
}

Đầu tiên toán hạng bên trái của toán tử dấu phẩy được đánh giá, toán hạng này tăng x từ 1 đến 2. Tiếp theo, toán hạng bên phải được đánh giá, tăng y từ 2 đến 3. Toán tử dấu phẩy trả về kết quả của toán hạng bên phải (3), sau đó được in ra console.

Lưu ý rằng dấu phẩy có mức độ ưu tiên thấp nhất trong tất cả các toán tử, thậm chí còn thấp hơn phép gán. Do đó, hai dòng code sau làm những việc khác nhau:

#include <iostream>
 
int main()
{
    int x{ 1 };
    int y{ 2 };
 
    ++x;
    std::cout << ++y;
 
    return 0;
}

Điều này làm cho toán tử dấu phẩy hơi nguy hiểm khi sử dụng.

Trong hầu hết mọi trường hợp, một câu lệnh được viết bằng toán tử dấu phẩy sẽ tốt hơn được viết dưới dạng các câu lệnh riêng biệt. Ví dụ, đoạn code trên có thể được viết là:

void foo(int x, int y) // Comma used to separate parameters in function definition
{
    add(x, y); // Comma used to separate arguments in function call
    constexpr int z{ 3 }, w{ 5 }; // Comma used to separate multiple variables being defined on the same line (don't do this)
}

Hầu hết các lập trình viên hoàn toàn không sử dụng toán tử dấu phẩy, với một ngoại lệ duy nhất là bên trong vòng lặp for, nơi việc sử dụng nó khá phổ biến. Chúng ta thảo luận về các vòng lặp for trong bài học tương lai 7.9 – Câu lệnh for (Không phải ở chương 5 này, mà là ở L.5. Xin phép không đánh số bài học rời rạc.).

Bạn nên: Tránh sử dụng toán tử dấu phẩy, ngoại trừ trong vòng lặp for.

2. Dấu phẩy làm dấu phân cách

Trong C ++, ký hiệu dấu phẩy thường được sử dụng làm dấu phân cách và những cách sử dụng này không gọi đến toán tử dấu phẩy. Một số ví dụ về dấu phẩy phân tách:

Không cần phải tránh dấu phẩy phân cách (trừ khi khai báo nhiều biến, điều này bạn không nên làm).

3. Toán tử điều kiện

Toán tửký hiệuFormHoạt động
Điều kiện?:c ? x : yNếu C không phải zero (true) khi đó x được đánh giá, nếu ngược lại thì y được đánh giá

Toán tử có điều kiện (? 🙂 (đôi khi còn được gọi là toán tử “số học nếu”) là một toán tử bậc ba (cần 3 toán hạng). Bởi vì nó đã từng là toán tử bậc ba duy nhất của C ++, đôi khi nó cũng được gọi là “toán tử bậc ba”.

Toán tử ?: Cung cấp một phương thức viết tắt để thực hiện một loại câu lệnh if / else cụ thể. 

Vui lòng xem lại bài – Giới thiệu về câu lệnh if nếu bạn cần tìm hiểu kỹ về if / else trước khi tiếp tục.

Câu lệnh if / else có dạng sau:

if (điều kiện)

  câu lệnh1;

else

  câu lệnh2;

Nếu điều kiện đánh giá là true, thì câu lệnh1 được thực thi, ngược lại câu lệnh 2 được thực thi.

Toán tử ?: Có dạng sau:

(điều kiện) ? biểu thức1: biểu thức2;

Nếu điều kiện đánh giá là true, thì biểu thức1 được thực thi, nếu không thì biểu thức 2 được thực thi. Lưu ý rằng biểu thức2 không phải là tùy chọn.

Hãy xem xét một câu lệnh if / else trông giống như sau:

if (x > y)
    larger = x;
else
    larger = y;

 có thể được viết lại thành:

larger = (x > y) ? x : y;

Khi sử dụng như vậy, toán tử điều kiện có thể giúp code gọn gàng mà không làm mất khả năng đọc.

4. Dấu ngoặc đơn trong toán tử điều kiện

Thông thường người ta thường đặt phần điều kiện của phép toán vào bên trong dấu ngoặc đơn, vừa để dễ đọc hơn, vừa để đảm bảo mức độ ưu tiên là đúng. Các toán hạng khác đánh giá như thể chúng được đặt trong ngoặc đơn, vì vậy không cần đặt ngoặc đơn rõ ràng cho những toán hạng đó.

Lưu ý rằng toán tử?: Có mức độ ưu tiên rất thấp. Nếu làm bất cứ điều gì khác ngoài việc gán kết quả cho một biến, toán tử toàn bộ ?: cũng cần được đặt trong dấu ngoặc đơn.

Ví dụ: để in giá trị x và y lớn hơn ra màn hình, chúng ta có thể làm như sau:

if (x > y)
    std::cout << x;
else
    std::cout << y;

Hoặc chúng ta có thể sử dụng toán tử điều kiện để thực hiện việc này:

std::cout << ((x > y) ? x : y);

Hãy kiểm tra điều gì sẽ xảy ra nếu chúng ta không đặt ngoặc đơn toàn bộ toán tử điều kiện trong trường hợp trên.

Vì toán tử << có độ ưu tiên cao hơn toán tử ?: Nên câu lệnh:

std::cout << (x > y) ? x : y;

sẽ đánh giá là:

(std::cout << (x > y)) ? x : y;

Điều đó sẽ in ra 1 (true) nếu x> y, hoặc 0 (false) nếu không!

Bên nên: Luôn luôn đặt dấu ngoặc đơn cho phần có điều kiện của toán tử điều kiện và xem xét cả việc đặt ngoặc đơn cho toàn bộ điều kiện.

5. Toán tử điều kiện đánh giá như một biểu thức

Bởi vì các toán hạng của toán tử điều kiện là các biểu thức chứ không phải là các câu lệnh, nên toán tử điều kiện có thể được sử dụng ở một số nơi mà if / else không thể.

Ví dụ, khi khởi tạo một biến hằng số:

#include <iostream>
 
int main()
{
    constexpr bool inBigClassroom { false };
    constexpr int classSize { inBigClassroom ? 30 : 20 };
    std::cout << "The class size is: " << classSize << '\n';
 
    return 0;
}

Không có câu lệnh if / else thỏa đáng cho điều này. Bạn có thể nghĩ rằng hãy thử 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
Group: https://www.facebook.com/groups/cafedev.vn/
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
Pinterest: https://www.pinterest.com/cafedevvn/
YouTube: https://www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
*/

#include <iostream>
 
int main()
{
    constexpr bool inBigClassroom { false };
    if (inBigClassroom)
        constexpr int classSize { 30 };
    else
        constexpr int classSize { 20 };
    std::cout << "The class size is: " << classSize;
 
    return 0;
}

Tuy nhiên, điều này sẽ không biên dịch và bạn sẽ nhận được thông báo lỗi rằng classSize không được xác định. Giống như cách các biến được định nghĩa bên trong hàm và bị huỷ ở cuối hàm, các biến được định nghĩa bên trong câu lệnh if hoặc else sẽ bị huỷ ở cuối câu lệnh if hoặc else. Do đó, classSize đã bị phá hủy khi chúng ta cố gắng in nó.

Nếu bạn muốn sử dụng if / else, bạn phải làm như sau:

#include <iostream>
 
int getClassSize(bool inBigClassroom)
{
    if (inBigClassroom)
        return 30;
    else
        return 20;
}
 
int main()
{
    const int classSize { getClassSize(false) };
    std::cout << "The class size is: " << classSize;
 
    return 0;
}

Điều này hoạt động vì chúng ta không xác định các biến bên trong if hoặc else, chúng ta chỉ trả lại một giá trị trở lại trình gọi, sau đó có thể được sử dụng làm trình khởi tạo.

6. Loại biểu thức phải khớp hoặc có thể chuyển đổi

Để tuân thủ đúng cách kiểm tra kiểu của C ++, cả hai biểu thức trong câu lệnh điều kiện phải khớp hoặc biểu thức thứ hai phải có thể chuyển đổi thành kiểu của biểu thức đầu tiên.

Vì vậy, trong khi bạn có thể mong đợi có thể làm điều gì đó như sau:

#include <iostream>
 
int main()
{
	constexpr int x{ 5 };
	std::cout << (x != 5 ? x : "x is 5"); // won't compile
 
	return 0;
}

Ví dụ trên sẽ không biên dịch. Một trong các biểu thức là số nguyên và biểu thức còn lại là chuỗi ký tự. Trình biên dịch sẽ cố gắng tìm cách chuyển đổi chuỗi ký tự thành một số nguyên, nhưng vì nó không biết cách làm thế nào nên nó sẽ báo lỗi. Trong những trường hợp như vậy, bạn sẽ phải sử dụng if / else.

7. Vậy khi nào bạn nên sử dụng toán tử điều kiện?

Toán tử điều kiện cung cấp cho chúng ta một cách thuận tiện để thu gọn một số câu lệnh if / else. Nó hữu ích nhất khi chúng ta cần một bộ khởi tạo có điều kiện (hoặc phép gán) cho một biến hoặc để chuyển một giá trị có điều kiện cho một hàm.

Nó không nên được sử dụng cho các câu lệnh if / else phức tạp, vì nó nhanh chóng trở nên khó đọc và dễ bị lỗi.

Bạn nên – Chỉ sử dụng toán tử điều kiện cho các điều kiện đơn giản mà bạn sử dụng kết quả và nó tăng cường khả năng đọc.

Cài ứng dụng cafedev để dễ dàng cập nhật tin và học lập trình mọi lúc mọi nơi tại đây.

Nguồn và Tài liệu tiếng anh tham khảo:

Tài liệu từ cafedev:

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:

Chào thân ái và quyết thắng!

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