Trong lập trình C#, toán tử là một phần quan trọng để thực hiện các phép toán và xử lý dữ liệu của biến. Trong bài viết này, chúng ta sẽ tìm hiểu về các loại toán tử trong C#, cú pháp và ý nghĩa của từng toán tử, độ ưu tiên của các toán tử và cùng xem một số ví dụ sử dụng toán tử.
Đặc điểm chung của toán tử trong C
Toán tử trong C# được xác định như sau:
- Là một công cụ để thao tác với dữ liệu.
- Mỗi toán tử được biểu diễn bằng một ký hiệu và đại diện cho một thao tác cụ thể trên dữ liệu.
Có tổng cộng 6 loại toán tử cơ bản trong C#: toán tử toán học, toán tử quan hệ, toán tử logic, toán tử khởi tạo và gán, toán tử so sánh trên bit và toán tử khác.
Cú pháp và ý nghĩa của từng loại toán tử
Toán tử toán học
Toán tử toán học thực hiện các phép toán cơ bản như cộng, trừ, nhân, chia và các phép toán khác. Dưới đây là một số ví dụ về toán tử toán học:
+
: Thực hiện phép cộng hai toán hạng. Ví dụ:a + b
kết quả bằng 19.-
: Thực hiện phép trừ hai toán hạng. Ví dụ:a - b
kết quả bằng 1.*
: Thực hiện phép nhân hai toán hạng. Ví dụ:a * b
kết quả bằng 90./
: Thực hiện phép chia lấy phần nguyên hai toán hạng nếu cả hai là số nguyên. Ngược lại, thực hiện chia bình thường. Ví dụ:a / b
kết quả bằng 1.%
: Thực hiện phép chia lấy dư hai toán hạng. Ví dụ:a % b
kết quả bằng 1.++
: Tăng giá trị lên 1 đơn vị. Ví dụ:a++
kết quả bằng 11.--
: Giảm giá trị xuống 1 đơn vị. Ví dụ:a--
kết quả bằng 9.
Lưu ý: Đối với toán tử ++
và --
, cần phân biệt giữa a++
và ++a
(hoặc a--
và --a
):
a++
: Sử dụng giá trị của biến a để thực hiện biểu thức trước rồi mới tăng lên 1 đơn vị. Tương tự choa--
.++a
: Tăng giá trị biến a lên 1 đơn vị rồi mới sử dụng biến a để thực hiện biểu thức. Tương tự cho--a
.
Toán tử quan hệ
Toán tử quan hệ dùng để so sánh giữa hai toán hạng và trả về kết quả là true hoặc false. Dưới đây là một số ví dụ về toán tử quan hệ:
==
: So sánh hai toán hạng có bằng nhau hay không. Nếu bằng, trả về true; ngược lại, trả về false. Ví dụ:a == b
trả về false.!=
: So sánh hai toán hạng có khác nhau hay không. Nếu khác, trả về true; ngược lại, trả về false. Ví dụ:a != b
trả về true.>
: So sánh hai toán hạng bên trái có lớn hơn toán hạng bên phải hay không. Nếu lớn hơn, trả về true; ngược lại, trả về false. Ví dụ:a > b
trả về true.: So sánh hai toán hạng bên trái có nhỏ hơn toán hạng bên phải hay không. Nếu nhỏ hơn, trả về true; ngược lại, trả về false. Ví dụ:
a b
trả về false.>=
: So sánh hai toán hạng bên trái có lớn hơn hoặc bằng toán hạng bên phải hay không. Nếu lớn hơn hoặc bằng, trả về true; ngược lại, trả về false. Ví dụ:a >= b
trả về true.=
: So sánh hai toán hạng có nhỏ hơn hoặc bằng hay không. Nếu nhỏ hơn hoặc bằng, trả về true; ngược lại, trả về false. Ví dụ:a = b
trả về false.
Lưu ý:
- Các toán tử quan hệ này chỉ áp dụng cho số hoặc ký tự.
- Hai toán hạng phải cùng loại (cùng là số hoặc cùng là ký tự).
- So sánh hai ký tự là so sánh mã ASCII của các ký tự đó.
Toán tử logic
Toán tử logic dùng để kết hợp các mệnh đề logic và trả về kết quả là true hoặc false. Dưới đây là một số ví dụ về toán tử logic:
&&
: Toán tử logic AND (và). Trả về true nếu tất cả toán hạng đều mang giá trị true; ngược lại, trả về false. Ví dụ:A && B
kết quả là false.||
: Toán tử logic OR (hoặc). Trả về true nếu có ít nhất 1 toán hạng mang giá trị true; ngược lại, trả về false. Ví dụ:A || B
kết quả là true.!
: Toán tử logic NOT (phủ định). Đảo ngược trạng thái logic của toán hạng. Nếu toán hạng mang giá trị true, kết quả sẽ là false và ngược lại. Ví dụ:!A
kết quả là false.
Lưu ý:
- Các toán tử
&&
và||
có thể áp dụng đồng thời nhiều toán hạng. Ví dụ:A && B && C || D || K
(Thứ tự thực hiện được trình bày ở phần sau). - Các toán hạng trong biểu thức chứa toán tử logic phải trả về true hoặc false.
Toán tử khởi tạo và gán
Toán tử khởi tạo và gán thường được sử dụng để lưu giá trị cho một biến. Dưới đây là một số toán tử khởi tạo và gán hay được sử dụng:
=
: Gán giá trị của toán hạng bên phải cho toán hạng bên trái. Ví dụ:K = 10
gán 10 cho biếnK
.+=
: Lấy toán hạng bên trái cộng toán hạng bên phải sau đó gán kết quả lại cho toán hạng bên trái. Ví dụ:K += 1
tương đương vớiK = K + 1
.-=
: Lấy toán hạng bên trái trừ toán hạng bên phải sau đó gán kết quả lại cho toán hạng bên trái. Ví dụ:K -= 1
tương đương vớiK = K - 1
.*=
: Lấy toán hạng bên trái nhân toán hạng bên phải sau đó gán kết quả lại cho toán hạng bên trái. Ví dụ:K *= 1
tương đương vớiK = K * 1
./=
: Lấy toán hạng bên trái chia lấy phần nguyên với toán hạng bên phải sau đó gán kết quả lại cho toán hạng bên trái. Ví dụ:K /= 1
tương đương vớiK = K / 1
.%=
: Lấy toán hạng bên trái chia lấy dư với toán hạng bên phải sau đó gán kết quả lại cho toán hạng bên trái. Ví dụ:K %= 1
tương đương vớiK = K % 1
.
Một số lưu ý khi sử dụng các toán tử trên:
- Toán tử bên trái thường là một biến, còn toán tử bên phải có thể là biến hoặc biểu thức.
- Một phép toán gán hoặc khởi tạo có thể được sử dụng như là toán hạng bên phải cho một phép gán hoặc khởi tạo khác. Ví dụ:
int H, K, T; H = K = T = 10; Console.WriteLine(" H = {0}, K = {1}, T = {2}", H, K, T); H += K = T = 5; Console.WriteLine(" H = {0}, K = {1}, T = {2}", H, K, T);
Kết quả khi chạy chương trình:
H = 10, K = 10, T = 10 H = 15, K = 5, T = 5
Toán tử so sánh trên bit
Có một số toán tử khác dùng để thực hiện các phép toán trên bit, nhưng chúng ít được sử dụng. Dưới đây là một số ví dụ về toán tử so sánh trên bit:
-
&
: Sao chép bit 1 tới kết quả nếu nó tồn tại trong cả hai toán hạng tại vị trí tương ứng, ngược lại thì bit kết quả bằng 0. Ví dụ:a & b
sẽ cho kết quả là 1000, tương đương với số 8 trong hệ thập phân. -
|
: Sao chép bit 1 tới kết quả nếu nó tồn tại ở một trong hai toán hạng tại vị trí tương ứng, ngược lại thì bit kết quả bằng 0. Ví dụ:a | b
sẽ cho kết quả 1011, tương đương với số 11 trong hệ thập phân. -
^
: Sao chép bit 1 tới kết quả nếu nó chỉ tồn tại ở một toán hạng tại vị trí tương ứng, ngược lại thì bit kết quả bằng 0. Ví dụ:a ^ b
sẽ cho kết quả 0011, tương đương với số 3 trong hệ thập phân. -
~
: Dùng để đảo bit 0 thành 1 và ngược lại 1 thành 0. Ví dụ:~a
sẽ cho kết quả 0101. -
: Dịch trái n bit. Giá trị toán hạng bên trái sẽ được dịch trái n bit với n được xác định bởi toán hạng bên phải. Ví dụ:
a 2
sẽ cho kết quả 101000. -
>>
: Dịch phải n bit. Giá trị toán hạng bên trái sẽ được dịch phải n bit với n được xác định bởi toán hạng bên phải. Ví dụ:a >> 2
sẽ cho kết quả 0010.
Toán tử khác
Ngoài các toán tử đã được giới thiệu ở trên, còn có một số toán tử khác cũng hay được sử dụng:
sizeof()
: Trả về kích cỡ của một kiểu dữ liệu. Ví dụ:sizeof(int)
sẽ trả về 4.typeof()
: Trả về kiểu của một lớp. Ví dụ:typeof(string)
sẽ trả vềSystem.String
.new
: Cấp phát vùng nhớ mới, áp dụng cho kiểu dữ liệu tham chiếu. Ví dụ:DateTime dt = new DateTime()
.is
: Xác định đối tượng có phải là một kiểu cụ thể nào đó hay không. Nếu đúng, trả về true; ngược lại, trả về false.as
: Ép kiểu mà không gây ra lỗi. Nếu ép kiểu không thành công, trả về null.?:
: Toán tử 3 ngôi. Trả về toán hạng 2 nếu toán hạng 1 là true và ngược lại trả về toán hạng 3. Cú pháp:(toán hạng 1) ? (toán hạng 2) : (toán hạng 3)
. Ví dụ:(1 2) ? 1 : 0
kết quả là 1 vì toán hạng 1 là (1 2) là đúng nên trả về toán hạng 2 là 1.,
: Sử dụng để kết nối nhiều biểu thức lại với nhau. Cú pháp:(biểu thức 1, biểu thức 2)
. Ý nghĩa: Duyệt qua biểu thức 1 sau đó duyệt qua biểu thức 2 và trả về giá trị của biểu thức 2. Ví dụ:(t = 5, 2)
sẽ duyệt qua biểu thức 1 làt = 5
, thực hiện gán 5 cho t sau đó duyệt qua biểu thức 2 là 2, cuối cùng trả về giá trị là 2.
Độ ưu tiên của toán tử
Độ ưu tiên của các toán tử biểu thị cho việc toán tử nào được ưu tiên thực hiện trước trong câu lệnh. Độ ưu tiên được cho trong bảng sau:
- Cao nhất:
()
,[]
,.
(Trái sang phải) +
,-
,++
,-
,!
,~
,new
,sizeof()
,typeof()
(Phải sang trái)*
,/
,%
(Trái sang phải),
>>
(Trái sang phải),
=
,>
,>=
(Trái sang phải)==
,!=
(Trái sang phải)&
,^
,|
(Trái sang phải)&&
,||
(Trái sang phải)? :
,=
(Phải sang trái)+=
,-=
,*=
,/=
,%=
,
(Thấp nhất)
Bảng trên chỉ thể hiện những toán tử đã học, còn nhiều toán tử khác ít khi sử dụng nên không được đề cập đến. Để đảm bảo thứ tự thực hiện, ta có thể nhóm các biểu thức vào cặp ngoặc tròn ()
.
Ví dụ chương trình sử dụng một số toán tử
Dưới đây là một số ví dụ về việc sử dụng toán tử trong chương trình:
Ví dụ 1: Các phép toán cơ bản
static void Main(string[] args) { int a, b, c; a = b = (c = 9) + 1; // khởi tạo giá trị: a = 10, b = 10, c = 9 a += b; // tương đương a = a + b b = c++; // thực hiện gán giá trị c cho biến b sau đó thực hiện c = c + 1 -c; // thực hiện c = c - 1 Console.WriteLine(" a = {0}, b = {1}, c = {2}", a, b, c); Console.ReadKey(); }
Kết quả khi chạy chương trình:
a = 10, b = 10, c = 9
Lưu ý: Đối với phép toán -c
hoặc c-
khi đứng độc lập thì không có khác biệt gì.
Ví dụ 2: Kết hợp các phép toán để kiểm tra số chẵn số lẻ
static void Main(string[] args) { string strSoNguyen; int SoNguyen; string KetQua; strSoNguyen = Console.ReadLine(); SoNguyen = Int32.Parse(strSoNguyen); KetQua = (SoNguyen % 2 == 0) ? "số chẵn" : "số lẻ"; Console.WriteLine("{0} là {1}", SoNguyen, KetQua); Console.ReadKey(); }
Đầu tiên, ta có 3 biến:
strSoNguyen
: Chứa dữ liệu nhập vào từ bàn phím.SoNguyen
: Chứa số nhập vào từ bàn phím.KetQua
: Chứa kết quả kiểm tra số vừa nhập là chẵn hay lẻ.
Tiếp theo, ta nhận kết quả nhập từ bàn phím bằng lệnh Console.ReadLine()
rồi gán giá trị cho biến strSoNguyen
.
Ép kiểu kết quả vừa nhập sang dạng số rồi gán giá trị vào biến SoNguyen
.
Sử dụng toán tử 3 ngôi kiểm tra xem số vừa nhập có chia hết cho 2 hay không (nếu chia hết cho 2 thì phép chia lấy dư với 2 sẽ cho kết quả là 0 và biểu thức SoNguyen % 2 == 0
sẽ trả về true ngược lại sẽ trả về false). Nếu chia hết thì trả về chuỗi số chẵn
ngược lại trả về chuỗi số lẻ
.
Cuối cùng là in kết quả ra màn hình.
Kết quả khi chạy chương trình:
Ví dụ nhập số 5: 5 là số lẻ
Để sử dụng thành thạo các toán tử trong C#, bạn nên luyện tập thường xuyên và vận dụng kết hợp nhiều toán tử để giải quyết vấn đề.