[Basic] Toán tử (Operators) trong C++ (P2)

Toán tử comma (toán tử dấu phẩy)

Toán tửKý hiệuDạngÝ nghĩa
comma,(x , y)Thực hiện x, sau đó thực hiện y, trả về y

int x = 10;

int y = 20;

int z = (++x, ++y); // Tăng x lên 1, tăng y lên 1 gán y cho z (z = 21)

Chú ý:

  • Tránh nhầm lẫn giữa toán tử comma và dấu phẩy thông thường
z = (x , y); // toán tử comma z = y

z = x, y; // Không phải toán tử comma, gán z = x

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

Toán tửKý hiệuDạngÝ nghĩa
Điều kiện?:c ? x : yNếu c có giá trị true trả về x, ngược lại c false trả về y

Toán tử điều kiện thay thế cho câu lệnh if/else

if (Điều kiện) 
{
   biểu_thức
}
else 
{
   biểu_thức_khác
}

Có thể viết dưới dạng toán tử điều kiện.

(Điều kiện) ? (biểu thức) : (biểu_thức_khác)

Xét ví dụ tìm max 2 số x và y:

C1 : Dùng câu lệnh if / else

if (x > y)
{
   max = x
}
else
{
   max = y
}

C2 : Dùng biểu thức điều kiện

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

Chú ý :

  • Trong C++ biểu thức điều kiện có giá trị 0 là false, khác 0 là true
int x = 0;

int y = x ? 4 : 5; // y = 5 vì x có giá trị 0; điều kiện false

int z = -1;

y = z ? 4 : 5; // y = 4 vì z # 0; điều kiện true

Toán tử so sánh

Toán tửKý hiệuDạng Ý nghĩa
Lớn hơn>x > y- True nếu x lớn hơn y
- False khi ngược lại
Nhỏ hơn<x < y- True nếu x nhỏ hơn y
- False khi ngược lại
Lớn hơn hoặc bằng>=x >= y- True nếu x lớn hơn hoặc bằng y
- False khi ngược lại
Nhỏ hơn hoặc bằng<=x <= y- True nếu x nhỏ hơn hoặc bằng y
- False khi ngược lại
Bằng!ERROR! unexpected operator '='x == y- True nếu x bằng y
- False khi ngược lại
Khác! = x != y- True nếu x không bằng y
- False khi ngược lại

Chú ý:

Toán tử logic (Logical operators)

Toán tử logic giúp chúng ta kiểm tra kết hơp nhiều điều kiện

Toán tửKý hiệuDạngÝ nghĩa
Not!!x- True nếu x false
- False nếu x true
And&&x && y- True khi cả x và y true
- False trong các trường hợp còn lại
Or||x || y- True nếu x hoặc y true
- False khi cả x và y false

Toán tử NOT (!(toán hạng))

Toán hạngKết quả
truefalse
falsetrue

int x = 3;

int y = !x; // y = 0 vì x = 3 (#0 là true), !true = false(= 0)

int z = 0;

y = !z;     //y = 1

Toán tử AND (&&)

Toán hạng tráiToán hạng phảiKết quả
falsefalsefalse
falsetruefalse
truefalsefalse
truetruetrue

Toán tử OR (||)

Toán hạng tráiToán hạng phảiKết quả
falsefalsefalse
falsetruetrue
truefalsetrue
truetruetrue

Short circuit

Trong toán tử AND giá trị trả về true chỉ khi cả 2 biểu thức đều trả về true. Nếu biểu thức thứ nhất trả về giá trị false, ngay lập tứctoán tử AND sẽ trả về false mà không cần xét tiếp điều kiện thứ 2.

Tương tự với toán tử OR giá trị trả về false chỉ khi cả 2 biểu thức đều trả về false. Nều biểu thức thứ nhất trả về giá trị true ngay lập tứctoán tử OR sẽ trả về giá trị true mà không cần xét tiếp dk thứ 2.

=> Ta gọi đó là short circuit

Sử dụng short circuit có thể có vần đề gì?

Ta xét ví dụ sau :

if (x == 1 && y++ > 2)
{
   //TODO
}

Nếu x != 1 thì y++ sẽ không được thực hiện

Nếu x = 1 thì y++ sẽ được thực hiện

=> y chỉ được tăng lên 1 khi x = 1.nên có thể chúng ta ko để ý, có thể xảy ra kết quả không mong muốn.

Toán tử trên bit (bitwise operator)

Toán tửKý hiệuDạngÝ nghĩa
Dịch trái<<x << yTất cả các bits của x dịch trái y bits
Dịch phải>>x >> yTất cả các bits của x dịch phải y bits
NOT~~xĐảo tất cả các bits của x
AND&x & yMỗi bit của x AND với mỗi bit của y
OR|x | yMỗi bit của x OR với mỗi bit của y
XOR^x ^ yMỗi bit của x XOR với mỗi bit của y

Chú ý :

  • Bitwise operator chỉ được thao tác trên số nguyên, không thể thao tác trên số thực.

Dịch trái (left shift) và Dịch phải (right shift)

Dịch trái (left shift) ta nhân với 2^x ra kết quả của phép toán.

5 <<  3 = 5 * 2^3 = 40

-5 << 4  = -5 * 2^4 = -80

Dịch phải (right shift) ta chia cho 2^x và làm tròn:

  • Về âm vô cùng cho phép dịch phải số âm.
  • Về 0 cho phép dịch phải số dương
5 >> 3 = 5 / (2^3) = 0.625  ~ 0 (làm tròn về 0 )
=> 5 >> 3 = 0

-5 >> 3 = -5 / (2 ^ 3) = -0.625 ~ - 1 (làm tròn về âm vô cùng)
=> -5 >> 3 = -1

Bits NOT

Lật các bit của giá trị

4 = 0100 (4 bit)

~4 = 1011 = 11 (hệ 10)

AND, OR , XOR bits

Or (|)

0 1 0 1    // Biểu diễn nhị phân của 5

0 1 1 0    // Biểu diễn nhị phân của 6

---OR---

0 1 1 1    // Biểu diễn nhị phân của 7

=> 5 | 6 = 7

AND (&)

0 1 0 1    // Biểu diễn nhị phân của 5

0 1 1 0    // Biểu diễn nhị phân của 6

---AND---

0 1 0 0    // Biểu diễn nhị phân của 4

=> 5 & 6 = 4

XOR (^)

Toán hạng tráiToán hạng phảiKết quả
falsefalsefalse
falsetruetrue
truefalsetrue
truetruefalse

0 1 0 1   // Biểu diễn nhị phân của 5

0 1 1 0   // Biểu diễn nhị phân của 6

---XOR---

0 0 1 1    // Biểu diễn nhị phân của 3 

=> 5 ^ 6 = 3

Chú ý:

  • Kết quả với toán tử logic trên bits có thể cho kết quả khác nhau giữa số nguyên có dấu (signed) và số nguyên không dấu (unsigned)
int x = ~1; // x = -2

unsigned int y = ~1; // y = 4294967294

Was this article helpful?

Leave A Comment?