คุณกำลังผสมสิ่งต่างๆมากมาย: คำสั่งควบคุมตัวดำเนินการและประเภทบูลีน แต่ละคนมีกฎของตัวเอง
คำสั่งควบคุมทำงานเหมือนตัวอย่างif
คำสั่ง C11 6.4.8.1:
ในทั้งสองรูปแบบการย่อยครั้งแรกจะดำเนินการถ้านิพจน์เปรียบเทียบไม่เท่ากันกับ 0
while
, for
ฯลฯ มีกฎเดียวกัน สิ่งนี้ไม่เกี่ยวข้องกับ "จริง" หรือ "เท็จ"
สำหรับตัวดำเนินการที่คาดคะเนว่าจะให้ผลลัพธ์แบบบูลีนพวกเขากำลังให้int
ค่า 1 หรือ 0 ตัวอย่างเช่นตัวดำเนินการความเท่าเทียมกัน C11 6.5.9:
ตัวดำเนินการแต่ละตัวจะให้ 1 หากความสัมพันธ์ที่ระบุเป็นจริงและ 0 หากเป็นเท็จ
ทั้งหมดข้างต้นเป็นเพราะ C ไม่มีประเภทบูลีนจนถึงปี 2542 และถึงแม้จะได้มากฎข้างต้นก็ไม่เปลี่ยนแปลง แตกต่างจากภาษาโปรแกรมอื่น ๆ ส่วนใหญ่ที่คำสั่งและตัวดำเนินการให้ผลเป็นประเภทบูลีน (เช่น C ++ และ Java) int
โดยให้ค่าเป็นศูนย์หรือไม่เป็นศูนย์ ตัวอย่างเช่นsizeof(1==1)
จะให้ 4 ใน C แต่ 1 ใน C ++
ประเภทบูลีนที่แท้จริงใน C ถูกตั้งชื่อ_Bool
และต้องการคอมไพเลอร์ที่ทันสมัย ส่วนหัวstdbool.h
แมโครกำหนดbool
, true
และfalse
ที่ขยายตัวออกไป_Bool
, 1
และ0
ตามลำดับ (สำหรับการทำงานร่วมกันกับ C ++)
อย่างไรก็ตามถือเป็นแนวทางปฏิบัติในการเขียนโปรแกรมที่ดีในการปฏิบัติต่อข้อความควบคุมและตัวดำเนินการราวกับว่าพวกเขาต้องการ / ให้ผลเป็นประเภทบูลีนจริงๆ มาตรฐานการเข้ารหัสบางอย่างเช่น MISRA-C แนะนำให้ปฏิบัติเช่นนั้น นั่นคือ:
if(ptr == NULL)
if(ptr)
แทน
if((data & mask) != 0)
if(data & mask)
แทน
จุดมุ่งหมายของรูปแบบดังกล่าวคือการเพิ่มความปลอดภัยให้กับประเภทโดยใช้เครื่องมือวิเคราะห์แบบคงที่ซึ่งจะช่วยลดข้อบกพร่อง กล่าวได้ว่าสไตล์นี้มีความหมายก็ต่อเมื่อคุณใช้เครื่องวิเคราะห์แบบคงที่ แม้ว่าในบางกรณีจะนำไปสู่การอ่านโค้ดที่สามารถจัดทำเอกสารด้วยตนเองได้มากขึ้น
if(c == '\0')
ดีเจตนาชัดเจนรหัสเป็นเอกสารในตัวเอง
เทียบกับ
if(c)
ไม่ดี อาจหมายถึงอะไรก็ได้และเราต้องค้นหาประเภทของc
รหัสเพื่อทำความเข้าใจ มันเป็นจำนวนเต็มตัวชี้หรืออักขระ?