Operators
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 |
Chú thích: ...
|
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
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
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
Lưu ý: ...
|
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
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
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
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.
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.
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.
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 }