Trong C và một số ngôn ngữ tương tự, so sánh các biểu thức boolean cho bằng false
hoặc true
là một thói quen nguy hiểm.
Trong C, bất kỳ biểu thức vô hướng (số hoặc con trỏ) có thể được sử dụng trong ngữ cảnh boolean, ví dụ như điều kiện của một if
câu lệnh. Quy tắc C if (cond)
tương đương với if (cond != 0)
- tức là 0 là sai và mọi giá trị khác không là đúng. Nếu cond
thuộc loại con trỏ, 0
được coi là hằng số con trỏ null; if (ptr)
có nghĩa là if (ptr != NULL)
.
Điều này có nghĩa rằng
if (cond)
và
if (cond == true)
không có nghĩa là điều tương tự . Điều đầu tiên là đúng nếu cond
khác không; điều thứ hai chỉ đúng nếu nó bằng true
, mà trong C (nếu bạn có #include <stdbool.h>
) chỉ đơn giản là 1
.
Ví dụ, isdigit()
hàm được khai báo <ctype.h>
trả về một int
giá trị, 0
nếu đối số là một chữ số, khác không nếu không. Nó có thể trở lại 42
để chỉ ra rằng điều kiện là đúng. So sánh 42 == true
sẽ thất bại.
Nó xảy ra 0
là giá trị duy nhất được coi là sai, vì vậy so sánh cho sự bình đẳng false
sẽ hoạt động; if (!cond)
và if (cond == false)
làm điều tương tự. Nhưng nếu bạn sẽ tận dụng lợi thế đó, bạn phải nhớ rằng so sánh với false
là ổn, và so sánh với true
thì không. Tệ hơn nữa, so sánh với true
sẽ hoạt động hầu hết thời gian (ví dụ, các toán tử đẳng thức và quan hệ luôn mang lại một trong hai 0
hoặc 1
). Điều này có nghĩa là bất kỳ lỗi nào bạn giới thiệu bằng cách sử dụng điều này vẫn có thể khó theo dõi. (Đừng lo lắng, họ sẽ xuất hiện ngay khi bạn giới thiệu mã cho một khách hàng quan trọng.)
C ++ có các quy tắc hơi khác nhau; ví dụ, bool
loại của nó được tích hợp chặt chẽ hơn một chút vào ngôn ngữ và if (cond)
chuyển đổi cond
thành loại bool
. Nhưng hiệu quả là (hầu hết) như nhau.
Một số ngôn ngữ khác có những gì người ta có thể gọi là booleans có hành vi tốt hơn, như vậy cond == true
và cond == false
(hoặc bất cứ cú pháp nào xảy ra) đều an toàn. Mặc dù vậy, tất cả các ngôn ngữ tôi đã nhìn thấy có một not
hoặc !
điều hành; Nó ở đó, vì vậy bạn cũng có thể sử dụng nó. Sử dụng cond == false
chứ không phải !cond
hoặc not cond
không, theo tôi, cải thiện khả năng đọc. (Đúng là !
nhân vật có thể khó nhìn thấy trong nháy mắt; đôi khi tôi thêm một khoảng trắng sau !
để tránh điều này.)
Và thường thì bạn có thể tránh được vấn đề và cải thiện sự rõ ràng bằng cách sắp xếp lại mã một chút. Ví dụ: thay vì:
if (!cond) {
do_this();
}
else {
do_that();
}
bạn có thể viết:
if (cond) {
do_that();
}
else {
do_this();
}
Điều đó không phải lúc nào cũng tốt hơn, nhưng sẽ không hại gì khi tìm kiếm cơ hội.
Tóm tắt: Trong C và C ++, so sánh bình đẳng true
và false
nguy hiểm, quá dài dòng và phong cách kém. Trong nhiều ngôn ngữ khác, những so sánh như vậy có thể không nguy hiểm, nhưng chúng vẫn quá dài dòng và phong cách kém.