Operators

From MakerLab Wiki
Jump to navigation Jump to search

Trong toán học, một "phép toán" (operation) là một quá trình toán học bao gồm 0 hoặc nhiều giá trị đầu vào, chúng được gọi là "toán hạng" (operand).

Hoạt động cụ thể được thực hiện giữa các toán hạng, được biểu thị bằng một ký hiệu gọi là "toán tử" (operator).

Kết quả của quá trình này, giúp tạo ra một giá trị mới, được gọi là giá trị đầu ra.

/**
 * Toán tử (+) có 2 toán hạng là số (1) và số (2)
 * Nó sẽ thực "phép cộng" giữa 2 toán hạng này
 * |
 * Kết quả giá trị đầu ra là số (3)
 * 
 * Toán tử (=) cũng có 2 toán hạng, vế "phải" gọi là (R_Value) và vế bên "trái" gọi là (L_Value)
 * Trong đó giá trị của (R_Value) là số (3)
 * Giá trị của (L_Value) là biến "a"
 * |
 * Toán tử này sẽ thực hiện "phép gán" giá trị (R_Value) cho giá trị (L_Value)
 * Kết quả biến "a" sẽ lưu số (3)
 */

int a = 1 + 2;

/**
 * Toán tử (+) có thứ tự ưu tiên là 3
 * Toán tử (=) có thứ tự ưu tiên là 16
 * |
 * Nên trong câu lệnh trên, toán tử (+) được thực hiện trước toán tử (=)
 * 
 * Tính kết hợp của cả hai toán tử (+) và (=) là từ "phải sang trái"
 * Vậy nên trình tự chương trình thực hiện như sau:
 * |
 * Lấy số (2) cộng số (1), ra số (3)
 * Lấy số (3) gán vào biến "a", kết quả "a=3"
 */

Mức độ ưu tiên của Toán tử

Để hỗ trợ phân tích cú pháp một biểu thức ghép, gồm nhiều toán tử trong cùng một câu lệnh.

Tất cả các toán tử được chỉ định một "mức độ ưu tiên" (precedence).

Trong C++, có tất cả 17 mức độ, từ 1 (mức cao nhất) đến 17 (mức thấp nhất).

Toán tử có mức ưu tiên cao hơn sẽ được thực hiện trước.

Tính kết hợp của Toán tử

Tuy nhiên trong cùng một biểu thức, có thể có những toán tử cùng "mức độ ưu tiên".

Lúc này "tính kết hợp" (associativity) sẽ cho biết cần thực hiện từ trái sang phải (→), hay từ phải sang trái (←).

Bảng Toán tử

Precedence Associativity Operator Miêu tả Mẫu
2 ++ Tăng sau lvalue++
–– Giảm sau lvalue––
3 + Unary plus +expression
- Unary minus -expression
++ Tăng trước ++lvalue
-- Giảm trước ––lvalue
5 * Nhân expression * expression
/ Chia expression / expression
% Chia lấy dư expression % expression
6 + Cộng expression + expression
- Trừ expression - expression
9 < So sánh nhỏ hơn expression < expression
<= So sánh nhỏ hơn hoặc bằng expression <= expression
> So sánh lớn hơn expression > expression
>= So sánh lớn hơn hoặc bằng expression >= expression
10 == So sánh bằng expression == expression
!= So sánh khác nhau expression != expression
16 = Phép gán bằng lvalue = expression
*= Phép gán nhân lvalue *= expression
/= Phép gán chia lvalue /= expression
%= Phép gán chia lấy dư lvalue %= expression
+= Phép gán cộng lvalue += expression
-= Phép gán trừ lvalue -= expression
Icon-Info-White.png Chú thích:
...
  • lvalue - viết tắt của "Left Value", là một biến, thường được đặt bên trái của phép gán.
  • expression - có thể là một biểu thức, một biến, hoặc một con số có giá trị.

Toán tử số học

( * )

_ Phép nhân là một trong bốn phép tính số học cơ bản.

_ Toán tử * thao tác trên 2 toán hạng để cho ra tích của 2 số.

Cú pháp

  • result = operand1 * operand2;

Tham số

Các kiểu dữ liệu dùng được: int, float, double, byte, short, long.

  • result - là một biến.
  • operand1 - là một biến hoặc hằng số.
  • operand2 - là một biến hoặc hằng số.

Code mẫu

Icon-Done-White.png Lưu ý:
...
  • Phép toán nhân có thể "bị tràn" (overflow) nếu kết quả lớn hơn phạm vi lưu trữ của kiểu dữ liệu đó.
  • Nếu một trong hai các toán hạng thuộc loại float hoặc double. Toán học "dấu phẩy động" sẽ được sử dụng để tính toán và kết quả phép nhân sẽ là một số "dấu phẩy động".
  • Nếu một trong hai các toán hạng thuộc loại float hoặc double và biến lưu kết quả là số nguyên. Thì chỉ lưu phần nguyên còn phần phân số bị mất.
byte a;
a = 35.79 * 10; // a = 255 (bị tràn)

int b;
b = 35.79 * 10; // b = 357 (phần phân số bị mất)

float c;
c = 35.79 * 10; // c = 357.9

( / )

_ Phép chia là một trong bốn phép tính số học cơ bản.

_ Toán tử / thao tác trên 2 toán hạng để cho ra thương của số chia và số bị chia.

Cú pháp

  • result = operand1 / operand2;

Tham số

Các kiểu dữ liệu dùng được: int, float, double, byte, short, long.

  • result - là một biến.
  • operand1 - là một biến hoặc hằng số.
  • operand2 - là một biến hoặc hằng số, giá trị phải khác 0.

Code mẫu

Icon-Done-White.png Lưu ý:
...
  • Nếu cả hai toán hạng đều thuộc kiểu số nguyên. Kết quả phép chia sẽ là một số nguyên, phần phân số bị bỏ qua.
  • Nếu một trong hai các toán hạng thuộc loại float hoặc double. Toán học "dấu phẩy động" sẽ được sử dụng để tính toán và kết quả phép chia sẽ là một số "dấu phẩy động".
  • Nếu một trong hai các toán hạng thuộc loại float hoặc double và biến lưu kết quả là số nguyên. Thì chỉ lưu phần nguyên còn phần phân số bị mất.
float a;
// Phép chia số nguyên
a = -9 / 5; // a = -1
a = 7 / 5;  // a = 1
a = 5 / 5;  // a = 1
a = 3 / 5;  // a = 0
a = 1 / -5; // a = 0
// Phép chia số dấu phẩy động
a = -9.0 / 5;  // a = -1.8
a = 7 / 5.0;   // a = 1.4
a = 5.0 / 5.0; // a = 1.0
a = 3 / 5.0;   // a = 0.6
a = 1.0 / -5;  // a = -0.2

int b;
b = 5.0 / 2.0; // b = 2 (phần phân số bị mất)

float c;
c = 5.0 / 2.0; // c = 2.5

( % )

_ Toán tử % là một phép chia lấy dư, thao tác trên 2 toán hạng để lấy phần dư của kết quả phép chia.

Cú pháp

  • result = operand1 % operand2;

Tham số

  • result - là một biến. Các kiểu dữ liệu dùng được: int, float, double.
  • operand1 - là một biến hoặc hằng số. Các kiểu dữ liệu dùng được: int.
  • operand2 - là một biến hoặc hằng số, giá trị phải khác 0. Các kiểu dữ liệu dùng được: int.

Code mẫu

Icon-Done-White.png Lưu ý:
...
  • Toán tử % không hoạt động với "số dấu phẩy động".
  • Nếu toán hạng đầu tiên là âm, kết quả sẽ là âm (hoặc bằng 0).
int x = 0;
x = 9 % 5;  // x = 4
x = 7 % 5;  // x = 2
x = 5 % 5;  // x = 0
x = 3 % 5;  // x = 3
//
x = -3 % 5; // x = -3 (toán hạng đầu tiên là số âm)
x = 3 % -5; // x = 3
//
x = 5.0 % 5;  // Báo lỗi!
x = 5 % 5.0;  // Báo lỗi!

( + )

_ Phép cộng là một trong bốn phép tính số học cơ bản.

_ Toán tử + thao tác trên 2 toán hạng để cho ra tổng của 2 số.

Cú pháp

  • result = operand1 + operand2;

Tham số

Các kiểu dữ liệu dùng được: int, float, double, byte, short, long.

  • result - là một biến.
  • operand1 - là một biến hoặc hằng số.
  • operand2 - là một biến hoặc hằng số.

Code mẫu

Icon-Done-White.png Lưu ý:
...
  • Phép toán cộng có thể "bị tràn" (overflow) nếu kết quả lớn hơn phạm vi lưu trữ của kiểu dữ liệu đó.
  • Nếu một trong hai các toán hạng thuộc loại float hoặc double. Toán học "dấu phẩy động" sẽ được sử dụng để tính toán và kết quả phép cộng sẽ là một số "dấu phẩy động".
  • Nếu một trong hai các toán hạng thuộc loại float hoặc double và biến lưu kết quả là số nguyên. Thì chỉ lưu phần nguyên còn phần phân số bị mất.
byte a;
a = 255 + 1;   // a = 0 (bị tràn)
a = 255 + 1.0; // a = 255 (bị tràn)

( - )

_ Phép trừ là một trong bốn phép tính số học cơ bản.

_ Toán tử - thao tác trên 2 toán hạng để cho ra hiệu của số trừ và số bị trừ.

Cú pháp

  • result = operand1 - operand2;

Tham số

Các kiểu dữ liệu dùng được: int, float, double, byte, short, long.

  • result - là một biến.
  • operand1 - là một biến hoặc hằng số.
  • operand2 - là một biến hoặc hằng số.

Code mẫu

Icon-Done-White.png Lưu ý:
...
  • Phép toán trừ có thể "bị tràn" (overflow) nếu kết quả lớn hơn phạm vi lưu trữ của kiểu dữ liệu đó.
  • Nếu một trong hai các toán hạng thuộc loại float hoặc double. Toán học "dấu phẩy động" sẽ được sử dụng để tính toán và kết quả phép trừ sẽ là một số "dấu phẩy động".
  • Nếu một trong hai các toán hạng thuộc loại float hoặc double và biến lưu kết quả là số nguyên. Thì chỉ lưu phần nguyên còn phần phân số bị mất.
byte a;
a = 0 - 1;   // a = 255 (bị tràn)
a = 0 - 1.0; // a = 0 (bị tràn)

Toán tử số học hợp nhất

( = )

_ Một dấu = trong ngôn ngữ lập trình C++ được gọi là "toán tử gán".

_ Nó có một ý nghĩa khác với trong lớp đại số nơi nó chỉ ra một phương trình hoặc đẳng thức.

_ Toán tử gán yêu cầu bộ vi điều khiển đánh giá bất kỳ giá trị hoặc biểu thức nào nằm ở bên phải của dấu bằng và lưu nó vào biến ở bên trái của dấu bằng.

Cú pháp

  • lvalue = rvalue;

Tham số

  • lvalue - là một biến.
  • rvalue - là một biến, một hằng số, một giá trị bất kì. Cũng có thể là một biểu thức hoặc một giá trị mà hàm trả về.

Code mẫu

Icon-Done-White.png Lưu ý:
...
  • Biến ở phía bên trái của toán tử gán (=) cần có khả năng giữ giá trị được lưu trữ trong đó. Nếu nó không đủ lớn để chứa một giá trị, thì giá trị được lưu trong biến sẽ không chính xác.
  • Đừng nhầm lẫn toán tử gán [ = ] (dấu bằng đơn) với toán tử so sánh [ == ] (dấu bằng kép), dùng để đánh giá xem hai biểu thức có bằng nhau hay không.
int var;
float varF = 84.5;

var = 84;            // Gán với một giá trị
var = varF;          // Gán với một "biến" (giá trị số dấu phẩy động)
var = 'T';           // Gán với một "kí tự" (giá trị số nguyên)
var = analogRead(0); // Gán với một "hàm"

( *= )

_ Đây là cách viết tắt thuận tiện để thực hiện phép nhân một biến với một hằng hoặc biến khác.

Cú pháp

  • x *= y; // tương đương với biểu thức x = x * y;

Tham số

Các kiểu dữ liệu dùng được: int, float, double, byte, short, long.

  • x - là một biến.
  • y - là một biến hoặc hằng số.

Code mẫu

float x = 2.5;
x *= 4; // x = 10

( /= )

_ Đây là cách viết tắt thuận tiện để thực hiện phép chia một biến với một hằng hoặc biến khác.

Cú pháp

  • x /= y; // tương đương với biểu thức x = x / y;

Tham số

Các kiểu dữ liệu dùng được: int, float, double, byte, short, long.

  • x - là một biến.
  • y - là một biến hoặc hằng số, giá trị phải khác 0.

Code mẫu

float x = 2.5;
x /= 2; // x = 1.25

( %= )

_ Đây là cách viết tắt thuận tiện để thực hiện phép chia lấy dư một biến với một hằng hoặc biến khác.

Cú pháp

  • x %= y; // tương đương với biểu thức x = x % y;

Tham số

Các kiểu dữ liệu dùng được: int.

  • x - là một biến.
  • y - là một biến hoặc hằng số, giá trị phải khác 0.

Code mẫu

int x = 7;
x %= 5; // x = 2

float y = 7;
y %= 5; // Báo lỗi!

( += ) và ( ++ )

_ Toán tử += là cách viết tắt thuận tiện để thực hiện phép cộng một biến với một hằng hoặc biến khác.

_ Toán tử ++ làm tăng giá trị của một biến lên 1.

Cú pháp ( += )

  • x += y; // tương đương với biểu thức x = x + y;

Tham số

Các kiểu dữ liệu dùng được: int, float, double, byte, short, long.

  • x - là một biến.
  • y - là một biến hoặc hằng số.

Cú pháp ( ++ )

Hai cú pháp sau tương đương với biểu thức { z = z + 1 } cũng như biểu thức { z += 1 }.

  • z++; // trả về giá trị hiện tại của z (giá trị cũ), sau đó tăng z lên một.
  • ++z; // tăng z lên một, sau đó trả về giá trị hiện tại của z (giá trị mới).

Tham số

Các kiểu dữ liệu dùng được: int, float, double, byte, short, long.

  • z - là một biến.

Dữ liệu trả về

  • Giá trị cũ hoặc mới của biến z.

Code mẫu

float x = 2;
int y = 3;
//
x += 0.5; // x = 2.5
x += y;   // x = 5.5

float z = 1;
x = ++z; // tăng z → trả về giá trị mới của z ... z = 2 và x = 2
x = z++; // trả về giá trị cũ của z → tăng z ... x = 2 và z = 3
//
z = 1.5;
x = ++z; // z = 2.5 và x = 2.5
x = z++; // x = 2.5 và z = 3.5

( -= ) và ( -- )

_ Toán tử -= là cách viết tắt thuận tiện để thực hiện phép trừ một biến với một hằng hoặc biến khác.

_ Toán tử -- làm giảm giá trị của một biến xuống 1.

Cú pháp ( -= )

  • x -= y; // tương đương với biểu thức x = x - y;

Tham số

Các kiểu dữ liệu dùng được: int, float, double, byte, short, long.

  • x - là một biến.
  • y - là một biến hoặc hằng số.

Cú pháp ( -- )

Hai cú pháp sau tương đương với biểu thức { z = z - 1 } cũng như biểu thức { z -= 1 }.

  • z--; // trả về giá trị hiện tại của z (giá trị cũ), sau đó giảm z xuống một.
  • --z; // giảm z xuống một, sau đó trả về giá trị hiện tại của z (giá trị mới).

Tham số

Các kiểu dữ liệu dùng được: int, float, double, byte, short, long.

  • z - là một biến.

Dữ liệu trả về

  • Giá trị cũ hoặc mới của biến z.

Code mẫu

float x = 5.5;
int y = 3;
//
x -= 0.5; // x = 5.0
x -= y;   // x = 2.0

float z = 2;
x = --z; // giảm z → trả về giá trị mới của z ... z = 1 và x = 1
x = z--; // trả về giá trị cũ của z → giảm z ... x = 1 và z = 0
//
z = 2.5;
x = --z; // z = 1.5 và x = 1.5
x = z--; // x = 1.5 và z = 0.5

Toán tử so sánh

( < ) và ( <= )

_ So sánh giá trị hoặc biến ở bên trái với giá trị hoặc biến ở bên phải của toán tử.

_ Với toán tử < kết quả trả về:

  • true - nếu toán hạng bên trái nhỏ hơn toán hạng bên phải.
  • false - nếu toán hạng bên trái lớn hơn hoặc bằng toán hạng bên phải.

_ Với toán tử <= kết quả trả về:

  • true - nếu toán hạng bên trái nhỏ hơn hoặc bằng toán hạng bên phải.
  • false - nếu toán hạng bên trái lớn hơn toán hạng bên phải.
Icon-Done-White.png Lưu ý:
...
  • Bạn có thể so sánh các biến thuộc các loại dữ liệu khác nhau nhưng điều đó có thể tạo ra kết quả không thể đoán trước.
  • Do đó nên so sánh các biến có cùng loại dữ liệu bao gồm cả loại có dấu/không dấu.

Cú pháp

  • (x < y)
  • (x <= y)

Tham số

Các kiểu dữ liệu dùng được: int, float, double, byte, short, long.

  • x - là một biến hoặc hằng số.
  • y - là một biến hoặc hằng số.

Code mẫu

if (x < y)
{ // tests if x is less (smaller) than y
  // do something only if the comparison result is true
}

if (x <= y)
{ // tests if x is less (smaller) than or equal to y
  // do something only if the comparison result is true
}

( > ) và ( >= )

_ So sánh giá trị hoặc biến ở bên trái với giá trị hoặc biến ở bên phải của toán tử.

_ Với toán tử > kết quả trả về:

  • true - nếu toán hạng bên trái lớn hơn toán hạng bên phải.
  • false - nếu toán hạng bên trái nhỏ hơn hoặc bằng toán hạng bên phải.

_ Với toán tử >= kết quả trả về:

  • true - nếu toán hạng bên trái lớn hơn hoặc bằng toán hạng bên phải.
  • false - nếu toán hạng bên trái nhỏ hơn toán hạng bên phải.
Icon-Done-White.png Lưu ý:
...
  • Bạn có thể so sánh các biến thuộc các loại dữ liệu khác nhau nhưng điều đó có thể tạo ra kết quả không thể đoán trước.
  • Do đó nên so sánh các biến có cùng loại dữ liệu bao gồm cả loại có dấu/không dấu.

Cú pháp

  • (x > y)
  • (x >= y)

Tham số

Các kiểu dữ liệu dùng được: int, float, double, byte, short, long.

  • x - là một biến hoặc hằng số.
  • y - là một biến hoặc hằng số.

Code mẫu

if (x > y)
{ // tests if x is greater (bigger) than y
  // do something only if the comparison result is true
}

if (x >= y)
{ // tests if x is greater (bigger) than or equal to y
  // do something only if the comparison result is true
}

( == ) và ( != )

_ So sánh giá trị hoặc biến ở bên trái với giá trị hoặc biến ở bên phải của toán tử.

_ Với toán tử == kết quả trả về:

  • true - nếu toán hạng bên trái bằng toán hạng bên phải.
  • false - nếu toán hạng bên trái khác toán hạng bên phải.

_ Với toán tử != kết quả trả về:

  • true - nếu toán hạng bên trái khác toán hạng bên phải.
  • false - nếu toán hạng bên trái bằng toán hạng bên phải.
Icon-Done-White.png Lưu ý:
...
  • Bạn có thể so sánh các biến thuộc các loại dữ liệu khác nhau nhưng điều đó có thể tạo ra kết quả không thể đoán trước.
  • Do đó nên so sánh các biến có cùng loại dữ liệu bao gồm cả loại có dấu/không dấu.

Cú pháp

  • (x == y)
  • (x != y)

Tham số

Các kiểu dữ liệu dùng được: int, float, double, byte, short, long.

  • x - là một biến hoặc hằng số.
  • y - là một biến hoặc hằng số.

Code mẫu

if (x == y)
{ // tests if x is equal to y
  // do something only if the comparison result is true
}

if (x != y)
{ // tests if x is not equal to y
  // do something only if the comparison result is true
}