Tìm hiểu về toán tử (operator) trong C / C++

Toán tử operator trong C

Tìm hiểu về toán tử (operator) trong C / C++

Operator (toán tử) được xem là nền tảng của bất kỳ ngôn ngữ lập trình nào. Tương tự như vậy, Operator trong C/C++ cũng là thành phần không thể thiếu để thực hiện đầy đủ chức năng của ngôn ngữ này. Chúng ta có thể xem operator như các biểu tượng giúp ta thực hiện phép toán và suy luận cụ thể lên các toán hạng. Nói các khác, operator sẽ hoạt động lên trên toán hạng.
Cụ thể hơn, cùng nhìn vào hằng đẳng thức sau:
c = a + b;
Ở đây, ‘+’ là operator thường được gọi là addition operator (toán tử cộng), còn ‘a’ và ‘a’ là các toán hạng. Addition operator sẽ chỉ thị compiler (trình biên dịch) cộng hai toán hạng ‘a’ và ‘b’ với nhau. C/C++ có sẵn nhiều kiểu operator và chúng có thể được phân thành:
  • Arithmetic Operators (toán tử số học): Là các operator được sử dụng để thực hiện các phép tính toán học lên toán hạng. Ví dụ: ( +, -, *, /, %,++,–)
    Arithmetic operator lại được chia làm hai dạng:
    • Unary Operators (toán tử đơn ngôi): Là operator tác động tới một toán hạng duy nhất. Ví dụ: (++ , –)
    • Binary Operators (toán tử đa ngôi): Là các operator tác động đến hai toán hạng. Ví dụ: (+ , – , * , /).
  • Relational Operators (toán tử quy chiếu): Relational operators được dùng để so sánh giá trị giữa hai toán hạng với nhau. Ví dụ như: để kiểm tra xem toán hạng này có bằng với toán hạng kia hay không, toán hạng này có lớn hơn toán hạng kia hay không,… Một vài relational operators gồm (==, >= , <= ).
  • Logical Operators (toán tử logic): Được dùng để liên kết hai hoặc nhiều điều kiện/hạn chế, hoặc để bổ sung đánh giá điều kiện cần cân nhắc ban đầu. Kết quả được logical operator trả ra là giá trị boolean hoặc là true hay false.
  • Bitwise Operators (toán tử cho bit): được dùng để thực hiện thao tác cấp-bit lên các toán hạng. Operators trước hết sẽ được convert về cấp bit, sau đó phép tính sẽ được thực hiện lên các toán hạng. Các phép tính toán học cộng, từ, nhân,… có thể được thực hiện ở cấp bit để xử lý được nhanh hơn.
  • Assignment Operators (toán tử gán): Assignment operators được dùng để gán giá trị cho một variable (biến). Toán hạng nằm bên trái assignment operator là một variable, và toán hạng nằm bên phải của assignment operator sẽ là value (giá trị). Giá trị bên tay phải phải có cùng kiểu dữ liệu với variable bên tay trái, nếu không, compiler sẽ báo lỗi.
    Assignment operators có thể chia làm:
    • “=”: Assignment operator đơn giản nhất. Operator này được sử dụng để gán giá trị nằm bên phải nó cho variable nằm bên trái.
      Ví dụ: a = 10; b = 20; ch = ‘y’;
    • “+=”: Là tổ hợp của operator ‘+’ và ‘=’. Đầu tiên, Operator sẽ cộng giá trị hiện có của variable nằm bên trái nó với giá trị nằm bên phải, và gán kết quả đến variable nằm bên trái.
      Ví dụ: (a += b) có thể viết lại thành (a = a + b). Nếu giá trị được lưu trữ ở a ban đầu là 5. Thì (a += 6) = 11.
    • “-=”: Là tổ hợp của operator ‘-‘ và ‘=’. Trước hết, operator sẽ trừ giá trị hiện có của variable nằm bên trái nó với giá trị nằm bên phải, và gán kết quả đến variable nằm bên trái .
      Ví dụ: (a -= b) có thể viết lại thành (a = a – b). Nếu giá trị được lưu trữ ở a ban đầu là 8. Thì (a -= 6) = 2.
    • “*=”: Là tổ hợp của operator ‘*’ và ‘=’. Trước hết, operator sẽ nhân giá trị hiện có của variable nằm bên trái nó với giá trị nằm bên phải, và gán kết quả đến variable nằm bên trái .
      Ví dụ: (a *= b) có thể viết lại thành (a = a * b), Nếu giá trị được lưu trữ ở a ban đầu là 5. Thì (a *= 6) = 30.
    • “/=”: Là tổ hợp của operator ‘/’ và ‘=’. Trước hết, operator sẽ chia giá trị hiện có của variable nằm bên trái nó với giá trị nằm bên phải, và gán kết quả đến variable nằm bên trái.
      Ví dụ: (a /= b) có thể viết lại thành (a = a / b) . Nếu giá trị được lưu trữ ở a ban đầu là 6. Thì (a /= 2) = 3.
  • Các Operator khác: Trong C or C++, ta vẫn còn nhiều operator khác được sử dụng để thực hiện nhiều thao tác khác nhau. Trong đó có thể kể đến:
    • sizeof operator: sizeof được sử dụng khá nhiều trong ngôn ngữ lập trình C/C++, đây là compile-time unary operator (toán tử đơn ngôi trong quá trình dịch) giúp tính toán kích thước của toán hạng của nó. Kết quả của sizeof sẽ là một số nguyên không phải số âm thường được ký hiệu bằng size_t. Về cơ bản, sizeof operator dùng để tính toán kích thước của biến.
    • Comma Operator (toán tử phẩy): Comma operator (được thể hiện bằng dấu ,) là binary operator đánh giá toán hạng đầu tiên của nó rồi hủy bỏ kết quả, ngay sau đó đánh giá toán hạng thứ hai và cho ra giá trị. Comma operator có mức ưu tiên thấp nhất trong tất cả các operator trong C. Comma (dấu ,) vừa mang vai trò operator lẫn separator (dấu phân tách).
    • Conditional Operator (toán tử điều kiện: Conditional operator được viết dưới dạng Expression1 ? Expression2 : Expression3 . Ở đây, Expression1 là điều kiện cần được đánh giá. Nếu condition(Expression1) là True ta sẽ thực thi và trả kếu quả của Expression2, mặc khác nếu condition(Expression1) là false thì ta sẽ thực thi và trả kết quả của Expression3. Chúng ta có thể dùng conditional operator để thay cho statement (khai báo) if..else.

Thứ tự ưu tiên của Operator

Bảng bên dưới là thứ tự ưu tiên (giảm dần từ trên xuống dưới) và tương tác giữa các operators trong C / C++ .
OPERATOR
MÔ TẢ
TƯƠNG TÁC
()
Dấu ngoặc (function call)
trái sang phải
[]
Ngoặc vuông (array subscript)

.
Member selection thông qua object name

->
Member selection thông qua pointer (con trỏ)

++/–
Tăng giảm Postfix (biểu thức hậu tố)

++/–
Tăng giảm Prefix (biểu thức tiền tố)
phải sang trái
+/-
cộng/trừ đơn ngôi

!~
Phủ định logic / bitwise complement

(type)
Cast (chuyển đổi giá trị sang giá trị tạm thời của type tương ứng)

*
Dereference

&
Địa chỉ (của toán hạng)

sizeof
Xác định kích thước tính theo byte cho thao tác

*,/,%
Nhân / chia / mô đun
trái sang phải
+/-
Cộng/trừ
trái sang phải
<< , >>
Chuyển bitwise sang trái, Chuyển bitwise sang phải
trái sang phải
< , <=
Quan hệ nhỏ hơn / nhỏ hơn hoặc bằng
trái sang phải
> , >=
Quan hệ lớn hơn / lớn hơn hoặc bằng
trái sang phải
== , !=
Quan hệ bằng / không bằng
trái sang phải
&
Bitwise AND
trái sang phải
^
Bitwise exclusive OR
trái sang phải
|
Bitwise inclusive OR
trái sang phải
&&
Logical AND
trái sang phải
||
Logical OR
trái sang phải
?:
Kết hợp ba điều kiện
phải sang trái
=
Gán
phải sang trái
+= , -=
Gán cộng / trừ

*= , /=
Gán nhân / chia

%= , &=
Gán Modulus/bitwise AND

^= , |=
Gán Bitwise exclusive/inclusive OR

<>=
Gán Bitwise shift left/right

,
Phân chia biểu thức
trái sang phải
Tham khảo: geeksforgeeks

Nhận xét