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

Đị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ênThứ tự thực hiệnToán tửMô tả
1None::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ố
3R -> 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ỏ
4L -> R->*
.*
Member pointer selector
Member object selector
5L -> R*
/
%
Toán tử nhân
Toán tử chia
Toán tử chia lấy phần dư
6L -> R+
-
Toán tử cộng
Toán tử trừ
7 L -> R<<
>>
Dịch bits trái
Dịch bits phải
8L -> 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
9L -> R!ERROR! illegal character '!'So sánh bằng
So sánh khác
10L -> R&AND bits
11L -> R^XOR bits
12L -> R|OR bits
13L -> R&&AND biểu thức
14L -> R||OR biểu thức
15R -> 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
16R -> LthrowNém ngoại lệ
17L -> 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ệuDạngÝ nghĩa
Cộng+a + bTổng a và b
Trừ-a - bHiệu a và b
Nhân *a * bTích a và b
Chia/a / bThương a và b
Chia lấy phần dư%a % bSố 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ệuDạngÝ nghĩa
Gán=x = yGán giá trị của y cho x
Cộng rồi gán+=x += yx = x + y
Trừ rồi gán-=x -= yx = x - y
Nhân rồi gán*=x *= yx = x * y
Chia rồi gán/=x /= yx = x / y
Chia lấy phần du rồi gán%=x %= yx = x % y

Toán tử tăng giảm (++, – – )

Toán tửKý hiệuDạngÝ nghĩa
Tăng - tiền tố++++xTăng x lên 1 trước, rồi thực hiện x
Giảm - tiền tố----xGiả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
Sizeofsizeofsizeof (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

Was this article helpful?

Leave A Comment?