ใน 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 มากเกินไปและสไตล์ที่ไม่ดี ในภาษาอื่น ๆ การเปรียบเทียบเช่นนี้อาจไม่เป็นอันตราย แต่ยังคงมีความละเอียดและสไตล์ที่ไม่ดี