Định nghĩa
Trong toán học, 1 toán tử (operator) là phép tính toán học liên quan đến 1 hoặc nhiều đầu vào (toán hạng – operands) tạo ra giá trị đầu ra.
Ví dụ:
int val1 = 10; int val2 = 20; // + là toán tử có 2 toán hạng // val1 là toán hạng thứ nhất //val2 là toán hạng thứ hai int res = val1 + val2;
Bảng các toán tử và độ ưu tiên
Toán tử có độ ưu tiên cao hơn được thực hiện trước.
Toán tử có độ ưu tiên 1 là cao nhất
L -> R Các toán tử có cùng độ ưu tiên sẽ có thứ tự thực hiện từ trái sang phải
R -> L Các toán tử có cùng độ ưu tiên sẽ có thứ tự thực hiện từ phải sang trái
Độ ưu tiên | Thứ tự thực hiện | Toán tử | Mô tả |
---|---|---|---|
1 | None | :: | Scope |
2 | L -> R | () {} [] . , -> ++ , -- | Toán tử gọi hàm Uniform initialization Chỉ số mảng Member access Tăng giảm hậu tố |
3 | R -> L | +, - ++, -- ! ~ (type) sizeof & * | Toán tử (+, -) 1 ngôi Tăng, giảm tiền tố NOT biểu thức NOT bits C-type cast Toán tử sizeof Toán tử lấy địa chỉ Dereference con trỏ |
4 | L -> R | ->* .* | Member pointer selector Member object selector |
5 | L -> R | * / % | Toán tử nhân Toán tử chia Toán tử chia lấy phần dư |
6 | L -> R | + - | Toán tử cộng Toán tử trừ |
7 | L -> R | << >> | Dịch bits trái Dịch bits phải |
8 | L -> R | < <= > >= | So sánh nhỏ hơn So sánh nhỏ hơn hoặc bang So sánh lớn hơn So sánh lớn hơn hoặc bằng |
9 | L -> R | !ERROR! illegal character '!' | So sánh bằng So sánh khác |
10 | L -> R | & | AND bits |
11 | L -> R | ^ | XOR bits |
12 | L -> R | | | OR bits |
13 | L -> R | && | AND biểu thức |
14 | L -> R | || | OR biểu thức |
15 | R -> L | ?: = *= /= %= += -= <<= >>= &= |= ^= | Toán tử điều kiện Toán tử gán Nhân xong rồi gán Chia xong rồi gán Chia lấy phần dư rồi gán Cộng xong rồi gán Trừ xong rồi gán Dịch bits trái rồi gán Dịch bits phải rồi gán AND bits rồi gán OR bits ròi gán XOR bits rồi gán |
16 | R -> L | throw | Ném ngoại lệ |
17 | L -> R | , | Toán tử dấu phẩy |
Ví dụ:
#include <iostream> using namespace std; int main() { int arr[] = { 1, 2, 3, 4, 5 }; int* ptr = arr; cout << *++ptr; return 0; }
Kết quả :
2
Trong ví dụ trên toán tử * (dereference) và toán tử ++ (tiền tố) có cùng độ ưu tiên, nên ta xét đến thứ tự thực hiện. Vì thứ tự của các toán tử này là R -> L nên toán tử ++ (tiền tố) sẽ được thực hiện trước, sau đó toán từ * (dereference) mới được thực hiện.
Toán tử số học
Toán tử | Ký hiệu | Dạng | Ý nghĩa |
---|---|---|---|
Cộng | + | a + b | Tổng a và b |
Trừ | - | a - b | Hiệu a và b |
Nhân | * | a * b | Tích a và b |
Chia | / | a / b | Thương a và b |
Chia lấy phần dư | % | a % b | Số dư chia a cho b |
Chú ý:
- Tránh side effect khi chia 2 số nguyên.
int val1 = 10; int val2 = 4; float res = val1 / val2; // Kết quả res = 2
=> Vì thương của 2 số nguyên là số nguyên
=> để ra kết quả đúng
float res = (float)val1 / val2; // Cho kết quả đúng res = 2.5 float res = (float)(val1 / val2); // Vẫn cho kết quả res = 2, vì kết quả được tính bằng 2 mới ép kiểu sang float
- Toán tử % (chia lấy phần dư) chỉ áp dụng cho số nguyên, KHÔNG áp dụng cho số thực.
int res = val1 % val2; //Đúng, kết quả là res = 2 float fval1 = 10.0f; float fval2 = 4.0f; int res = fval1 % fval2; //Lỗi, vì toán tử % chỉ áp dụng cho số nguyên.
- Dấu của kết quả toán tử %
int res = -10 % 4; int res = -10 % -4;
=> Kết quả cùng là -2
Kết hợp với toán tử gán
Toán tử | Ký hiệu | Dạng | Ý nghĩa |
---|---|---|---|
Gán | = | x = y | Gán giá trị của y cho x |
Cộng rồi gán | += | x += y | x = x + y |
Trừ rồi gán | -= | x -= y | x = x - y |
Nhân rồi gán | *= | x *= y | x = x * y |
Chia rồi gán | /= | x /= y | x = x / y |
Chia lấy phần du rồi gán | %= | x %= y | x = x % y |
Toán tử tăng giảm (++, – – )
Toán tử | Ký hiệu | Dạng | Ý nghĩa |
---|---|---|---|
Tăng - tiền tố | ++ | ++x | Tăng x lên 1 trước, rồi thực hiện x |
Giảm - tiền tố | -- | --x | Giảm x đi 1 trước rồi thực hiện x |
Tăng - hậu tố | ++ | x++ | Thực hiện x rối sau đó mới tăng x lên 1 |
Giảm - hậu tố | -- | x-- | Thực hiện x rồi sau đó giảm x đi 1 |
int x = 5; int y = ++x; //tăng x lên 6, gán 6 cho y (x = 6, y = 6) int x = 5; int y = x++; //gán x = 5 cho y, sau đó tăng x lên 6 (x = 6, y = 5)
Chú ý :
- Tránh sử dụng toán tử tăng, giảm vi phạm Undefine behavior
=> có thể xem undefine bihavior tại : Undefine behavior
Toán tử sizeof
Toán tử | Ký hiệu | Dạng | Ý nghĩa |
---|---|---|---|
Sizeof | sizeof | sizeof (type) sizeof (variable) | Trả về kích thước (byte) của biến hoặc kiểu dữ liệu |
int x = 10; sizeof(x); //trả về giá trị kích thước biến x sizeof(float); //trả về kích thước kiểu dữ liệu float sizeof("Hello"); //trả về kích thước string literal (6 bytes)
=> có thể xem thêm về literal : Biến và kiểu dữ liệu
Leave A Comment?