ใน C และภาษาที่คล้ายคลึงกันการเปรียบเทียบนิพจน์บูลีนเพื่อความเท่าเทียมกันfalseหรือtrueเป็นนิสัยที่อันตราย
ใน C นิพจน์สเกลาร์ใด ๆ (ตัวเลขหรือตัวชี้) สามารถใช้ในบริบทบูลีนเช่นเป็นเงื่อนไขของifคำสั่ง กฎ C if (cond)คือเทียบเท่ากับif (cond != 0)- กล่าวคือศูนย์เป็นเท็จและค่าที่ไม่เป็นศูนย์ใด ๆเป็นจริง หากcondเป็นประเภทพอยน์เตอร์0จะถือว่าเป็นค่าคงที่ตัวชี้โมฆะ วิธีif (ptr)if (ptr != NULL)
ซึ่งหมายความว่า
if (cond)
และ
if (cond == true)
ไม่ได้หมายถึงสิ่งเดียวกัน ข้อแรกเป็นจริงถ้าcondไม่ใช่ศูนย์ ที่สองเป็นความจริง แต่ถ้ามันเท่ากันtrueซึ่งใน C (ถ้าคุณมี#include <stdbool.h>) 1เป็นเพียง
ตัวอย่างเช่นisdigit()ฟังก์ชั่นที่ประกาศในการ<ctype.h>คืนintค่า0ถ้าอาร์กิวเมนต์เป็นตัวเลขที่ไม่ใช่ศูนย์ถ้ามันไม่ได้ สามารถย้อนกลับ42เพื่อระบุว่าเงื่อนไขเป็นจริง การเปรียบเทียบ42 == trueจะล้มเหลว
มันเกิดขึ้นที่0เป็นค่าเดียวที่ถือว่าเป็นเท็จดังนั้นการเปรียบเทียบสำหรับความเสมอภาคที่falseจะทำงาน; if (!cond)และif (cond == false)ทำสิ่งเดียวกัน แต่ถ้าคุณจะใช้ประโยชน์จากสิ่งนั้นคุณต้องจำไว้ว่าการเปรียบเทียบกับfalseมันโอเคและการเปรียบเทียบtrueไม่ใช่ เลวยังเทียบกับtrueจะทำงานมากที่สุดของเวลา (เช่นความเสมอภาคและความสัมพันธ์ผู้ประกอบการมักจะให้ผลอย่างใดอย่างหนึ่ง0หรือ1) ซึ่งหมายความว่าข้อบกพร่องใด ๆ ที่คุณแนะนำโดยใช้สิ่งนี้ยังคงเป็นเรื่องยากที่จะติดตาม (ไม่ต้องกังวลพวกเขาจะปรากฏขึ้นทันทีที่คุณสาธิตรหัสไปยังลูกค้าคนสำคัญ)
C ++ มีกฎแตกต่างกันเล็กน้อย ตัวอย่างของboolประเภทเป็นบิตที่ผสานรวมมากยิ่งขึ้นในภาษาและif (cond)แปลงที่จะพิมพ์cond boolแต่ผลที่ได้คือ (ส่วนใหญ่) เหมือนกัน
ภาษาอื่นบางภาษามีสิ่งที่เราเรียกว่าบูลีนที่มีพฤติกรรมดีกว่าเช่นนั้นcond == trueและcond == false(หรือสิ่งที่จะเกิดขึ้นกับไวยากรณ์) นั้นปลอดภัย แม้กระนั้นทุกภาษาที่ฉันเห็นมีnotหรือ!ผู้ปฏิบัติ มันอยู่ที่นั่นดังนั้นคุณอาจใช้มันเช่นกัน ในความคิดของฉันใช้cond == falseมากกว่า!condหรือnot condไม่ปรับปรุงการอ่าน (มันเป็นความจริงที่ว่า!ตัวละครอาจมองเห็นได้ยากบางครั้งฉันก็เพิ่มช่องว่างหลังจาก!เพื่อหลีกเลี่ยงสิ่งนี้)
และบ่อยครั้งที่คุณสามารถหลีกเลี่ยงปัญหาและปรับปรุงความชัดเจนโดยจัดเรียงรหัสใหม่เล็กน้อย ตัวอย่างเช่น:
if (!cond) {
do_this();
}
else {
do_that();
}
คุณอาจจะเขียน:
if (cond) {
do_that();
}
else {
do_this();
}
มันไม่ได้ดีกว่าเสมอไป แต่ก็ไม่เจ็บที่จะมองหาโอกาสในที่ที่มันอยู่
สรุป:ใน C และ C ++ ความเท่าเทียมกันเมื่อเปรียบเทียบกับtrueและfalseเป็นอันตราย verbose มากเกินไปและสไตล์ที่ไม่ดี ในภาษาอื่น ๆ การเปรียบเทียบเช่นนี้อาจไม่เป็นอันตราย แต่ยังคงมีความละเอียดและสไตล์ที่ไม่ดี