Các phép tính số học
Các phép toán số học bao gồm 5 phép toán nhị phân, tức là phép cộng
, phép trừ
, phép nhân
, phép chia
và phép chia modulo-chia lấy dư, và 2 phép toán đơn vị, tức là phép cộng và phép trừ. Các ký hiệu được sử dụng cho từng phép toán đó được đưa ra trong bảng dưới đây.
Trong cột chứa các ví dụ, e1
và e2
là các biểu thức con tùy ý. Tính kết hợp được đánh dấu bằng L
(từ trái sang phải) và R
(từ phải sang trái). Số trong cột đầu tiên có thể được coi là thứ tự ưu tiên thực hiện các phép toán.
P | Biểu tượng | Sự miêu tả | Ví dụ | A |
---|---|---|---|---|
2 | + | Phép cộng đơn | +e1 | R |
2 | - | Phép trừ đơn | -e1 | R |
3 | * | Phép nhân | e1 * e2 | L |
3 | / | Phép chia | e1 / e2 | L |
3 | % | Phép chia modulo | e1 % e2 | L |
4 | + | Phép cộng | e1 + e2 | L |
4 | - | Phép trừ | e1 - e2 | L |
Thứ tự trong bảng tương ứng với mức độ ưu tiên giảm dần: Phép cộng và phép trừ đơn được tính trước phép nhân và phép chia, trong khi phép chia đơn được tính trước phép cộng và phép trừ.
double a = 3 + 4 * 5; // a = 23
Trên thực tế, phép cộng đơn không có tác dụng gì trong phép tính, nhưng có thể được sử dụng để trực quan hóa biểu thức tốt hơn. Phép trừ đơn đảo ngược dấu của toán hạng của nó.
Các phép toán số học được sử dụng cho các kiểu số hoặc các kiểu có thể ép kiểu thành chúng. Kết quả tính toán là một RValue
. Trong tính toán, các vị trí lưu trữ của toán hạng số nguyên thường được mở rộng lên đến "số nguyên lớn nhất" được sử dụng hoặc đến int
(nếu tất cả các kiểu số nguyên có kích thước nhỏ hơn), cũng như ép kiểu thành một kiểu chung. Bạn có thể tìm thấy thêm thông tin chi tiết trong phần Typecasting.
bool b1 = true;
bool b2 = -b1;
2
Trong ví dụ này, biến b1
"mở rộng" thành kiểu int
với giá trị 1. Đảo ngược dấu sẽ cho kết quả là -1, ngược lại khi ép kiểu thành bool
sẽ cho kết quả là true
(vì -1 không phải là số không). Không hoan nghênh việc sử dụng kiểu logic trong phép tính số học.
Chia số nguyên cho ra số nguyên, tức là phần phân số, nếu có, sẽ bị bỏ qua. Có thể kiểm tra bằng cách sử dụng tập lệnh ExprArithmetic.mq5
.
int a = 24 / 7; // ok: a = 3
int b = 24 / 8; // ok: b = 3
double c = 24 / 7; // ok: c = 3 (!)
2
3
Mặc dù biến c
được mô tả là double
, nhưng có các số nguyên trong biểu thức để khởi tạo nó; do đó, phép chia được thực hiện là một số nguyên. Để thực hiện phép chia với phần phân số, ít nhất một toán hạng phải có kiểu thực (toán hạng thứ hai cũng sẽ được ép kiểu thành nó).
double d = 24.0 / 7; // ok: d = 3.4285714285714284
Toán tử %
tính toán phần dư của phép chia số nguyên (chỉ áp dụng cho hai toán hạng kiểu số nguyên).
int x = 11 % 5; // ok: x = 1
int y = 11 % 5.0; // không có số thực nào có thể được sử dụng
// error: '%' - illegal operation use
2
3
Khi các toán hạng có dấu khác nhau, toán tử *
và /
đưa ra số âm. Các quy tắc sau đây áp dụng cho toán tử %
:
- nếu số chia của toán tử
%
là số âm, dấu "thoát"; và - nếu số bị chia của toán tử
%
là số âm thì kết quả là số âm;
Điều này dễ kiểm tra bằng cách sử dụng phép tính chia modulo thay thế: m % n = m - m / n * n
. Cần lưu ý rằng phép chia m / n
cho số nguyên sẽ được làm tròn; do đó, m / n * n
không bằng m
, trong trường hợp chung.
Trong phần Đặc điểm của Mảng , chúng ta đã đi sâu vào ý tưởng rằng một mảng đa chiều có thể được biểu diễn bằng một mảng một chiều do tính toán lại các chỉ số của các phần tử của chúng. Chúng ta cũng cung cấp công thức để có được một chỉ số thông qua trong một mảng một chiều theo tọa độ (số cột X và số hàng Y tại độ dài chuỗi N) của mảng hai chiều.
index = Y * N + X
Phép toán %
cho phép chúng ta thực hiện phép tính ngược thuận tiện hơn, tức là tìm X và Y theo chỉ số:
Y = index / N
X = index % N
2
Nếu một kết quả không thể trình bày NaN
(Not A Number, chẳng hạn như vô cực, căn bậc hai của một số âm, v.v.) thu được ở một giai đoạn nào đó trong khi tính toán biểu thức, tất cả các thao tác tiếp theo với nó cũng sẽ tạo ra NaN
. Nó có thể được phân biệt với một số bình thường bằng cách sử dụng hàm MathIsValidNumber
(xem Hàm toán học ).
double z = DBL_MAX / DBL_MIN - 1; // inf: Not A Number
Ở đây, nó được trừ đi khỏi NaN
(thu được từ phép chia) và trả lại NaN
.
Phép toán cộng được định nghĩa cho các chuỗi và thực hiện phép nối, tức là kết hợp chúng.
string s = "Hello, " + "world!"; // "Hello, World!"
Các thao tác khác đối với chuỗi bị cấm.