Các phép toán logic
Các phép toán logic thực hiện tính toán trên các toán hạng logic và trả về kết quả có cùng kiểu.
P | Biểu tượng | Mô tả | Ví dụ | A |
---|---|---|---|---|
2 | ! | Logic NOT | !e1 | R |
11 | && | Logic AND | e1 && e2 | L |
12 | || | Logic OR | e1 || e2 | L |
Phép toán logic NOT biến đổi
true
thànhfalse
vàfalse
thànhtrue
.Phép toán logic AND là
true
nếu cả hai toán hạng đều bằngtrue
.Phép toán logic OR bằng
true
nếu ít nhất một toán hạng bằngtrue
.
Toán tử AND và OR luôn tính toán toán hạng từ trái sang phải và nếu có thể, hãy sử dụng phím tắt tính toán. Nếu toán hạng bên trái bằng false
, thì toán tử AND bỏ qua toán hạng thứ hai, vì nó không ảnh hưởng đến bất cứ điều gì – kết quả đã là false
. Nếu toán hạng bên trái bằng true
, thì toán tử OR bỏ qua toán hạng thứ hai vì cùng lý do, vì trong mọi trường hợp, kết quả sẽ bằng true
.
Điều này thường được sử dụng trong các chương trình để ngăn ngừa lỗi trong toán hạng thứ hai (và các toán hạng tiếp theo). Ví dụ, chúng ta có thể tự bảo vệ mình khỏi lỗi khi truy cập vào một phần tử mảng không tồn tại:
index < ArraySize(array) && array[index] != 0
Ở đây chúng ta sử dụng hàm tích hợp ArraySize
trả về độ dài mảng. Chỉ khi index
nhỏ hơn độ dài, phần tử có index
này mới được đọc và so sánh với số không.
Kiểm tra ngược lại, sử dụng ||
cũng được sử dụng, ví dụ:
ArraySize(array) == 0 || array[0] == 0
Điều kiện đúng ngay lập tức nếu mảng là null
. Và chỉ khi có các phần tử, việc kiểm tra bổ sung cho nội dung sẽ tiếp tục.
Nếu biểu thức bao gồm nhiều toán hạng được kết hợp bằng phép OR
logic, thì với giá trị true
đầu tiên (nếu có), tổng kết quả true
sẽ được tính ngay lập tức. Tuy nhiên, nếu các toán hạng được kết hợp bằng phép AND
logic, thì với giá trị false
đầu tiên, tổng kết quả false
sẽ được tính ngay lập tức.
Tất nhiên, bạn có thể kết hợp các phép toán khác nhau trong một biểu thức, xét đến mức độ ưu tiên khác nhau của chúng: Phép phủ định được thực hiện trước, sau đó là các điều kiện liên quan đến AND
và cuối cùng là các điều kiện liên quan đến OR
. Nếu cần một trình tự khác, trình tự đó phải được chỉ định rõ ràng bằng cách sử dụng dấu ngoặc đơn.
Ví dụ, biểu thức sau không có dấu ngoặc đơn, A && B || C && D
, thực tế tương đương với: (A && B) || (C && D)
. Để OR logic được thực thi như là lệnh đầu tiên, nó phải được đặt trong dấu ngoặc đơn: A && (B || C) && D
. Để biết thêm chi tiết về cách sử dụng dấu ngoặc đơn, hãy xem phần Nhóm với dấu ngoặc đơn .
Các ví dụ đơn giản được đưa ra trong tập lệnh ExprLogical.mq5
để kiểm tra các hoạt động logic trong thực tế.
int x = 3, y = 4, z = 5;
bool expr1 = x == y && z > 0; // false, x != y, z không quan trọng
bool expr2 = x != y && z > 0; // true, cả hai điều kiện đều được tuân thủ
bool expr3 = x == y || z > 0; // true, điều đó là đủ khi z > 0
bool expr4 = !x; // false, x phải bằng 0 để có giá trị true
bool expr5 = x > 0 && y > 0 && z > 0; // true, cả 3 đều được tuân thủ
bool expr6 = x < 0 || y > 0 && z > 0; // true, y và z là đủ
bool expr7 = x < 0 || y < 0 || z > 0; // true, z là đủ
2
3
4
5
6
7
8
Trong chuỗi tính toán expr6
, trình biên dịch đưa ra cảnh báo: "Kiểm tra thứ tự ưu tiên của toán tử để biết lỗi có thể xảy ra; sử dụng dấu ngoặc đơn để làm rõ thứ tự ưu tiên".
Các phép toán logic &&
và ||
không nên được kết hợp với các phép toán bitwise &
và |
(sẽ được xem xét ở phần tiếp theo).