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 falsehoặc truelà 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 ifcâ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 condthuộ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 condkhá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 intgiá trị, 0nế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 == truesẽ thất bại.
Nó xảy ra 0là giá trị duy nhất được coi là sai, vì vậy so sánh cho sự bình đẳng falsesẽ 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 falselà ổn, và so sánh với truethì không. Tệ hơn nữa, so sánh với truesẽ 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 0hoặ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ụ, boolloạ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 condthà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 == truevà 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 nothoặc !điều hành; Nó ở đó, vì vậy bạn cũng có thể sử dụng nó. Sử dụng cond == falsechứ không phải !condhoặc not condkhô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 truevà falsenguy 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.