เกี่ยวกับประเภทบูลีนใน C
ประเภทบูลีนถูกนำมาใช้ในภาษาซีค่อนข้างช้าในปี 2542 ก่อนหน้านั้น C ไม่มีประเภทบูลีน แต่ใช้แทนint
นิพจน์บูลีนทั้งหมด ดังนั้นตัวดำเนินการทางตรรกะทั้งหมดเช่น> == !
etc จะส่งคืนint
ค่า1
หรือ0
.
เป็นเรื่องกำหนดเองสำหรับแอปพลิเคชันที่จะใช้ประเภทโฮมเมดเช่นtypedef enum { FALSE, TRUE } BOOL;
ซึ่งจะลดint
ขนาดเป็นขนาด
C ++ มีประเภทบูลีนที่ดีกว่าและชัดเจนbool
ซึ่งมีขนาดไม่เกิน 1 ไบต์ ในขณะที่ประเภทบูลีนหรือนิพจน์ใน C จะลงท้ายด้วย 4 ไบต์ในกรณีที่แย่ที่สุด ความเข้ากันได้บางอย่างกับ C ++ ถูกนำมาใช้ใน C กับมาตรฐาน C99 C จากนั้นมีประเภทบูลีน_Bool
และส่วนหัวstdbool.h
ด้วย
stdbool.h
ให้ความเข้ากันได้กับ C ++ ส่วนหัวนี้กำหนดมาโครbool
(การสะกดแบบเดียวกับคีย์เวิร์ด C ++) ที่ขยาย_Bool
เป็นประเภทซึ่งเป็นประเภทจำนวนเต็มขนาดเล็กซึ่งอาจมีขนาดใหญ่ 1 ไบต์ ในทำนองเดียวกันส่วนหัวมีสองแมโครtrue
และfalse
การสะกดคำเดียวกับคำหลัก C ++ แต่มีความเข้ากันได้กับโปรแกรม C เก่า ดังนั้นtrue
และfalse
ขยายตัวออกไป1
และ0
ใน C int
และประเภทของพวกเขาคือ มาโครเหล่านี้ไม่ได้อยู่ในประเภทบูลีนอย่างที่คีย์เวิร์ด C ++ ที่เกี่ยวข้องจะเป็น
ในทำนองเดียวกันเพื่อวัตถุประสงค์ในการใช้งานร่วมกันได้ย้อนหลังตัวดำเนินการเชิงตรรกะใน C ยังคงส่งคืนมาint
จนถึงทุกวันนี้แม้ว่า C ในปัจจุบันจะมีประเภทบูลีน ในขณะที่อยู่ใน C ++ ตัวดำเนินการเชิงตรรกะจะส่งคืน a bool
. ดังนั้นนิพจน์เช่นsizeof(a == b)
จะให้ขนาดเป็นint
C แต่มีขนาดเป็นbool
C ++
เกี่ยวกับตัวดำเนินการตามเงื่อนไข ?:
ตัวดำเนินการแบบมีเงื่อนไข?:
เป็นตัวดำเนินการที่แปลกและมีนิสัยแปลก ๆ มันเป็นความผิดพลาดที่จะเชื่อว่ามันเป็น 100% if() { } else {}
เทียบเท่ากับ ไม่มาก
มีจุดลำดับระหว่างการประเมินตัวถูกดำเนินการที่ 1 และ 2 หรือ 3 ตัว?:
ดำเนินการได้รับการรับประกันว่าจะประเมินเฉพาะตัวถูกดำเนินการที่ 2 หรือ 3 ดังนั้นจึงไม่สามารถเรียกใช้ผลข้างเคียงใด ๆ ของตัวถูกดำเนินการที่ไม่ได้รับการประเมิน รหัสเหมือนจะไม่ดำเนินการtrue? func1() : func2()
func2()
จนถึงตอนนี้ดีมาก
แต่มีกฎพิเศษที่ระบุว่าตัวถูกดำเนินการ 2 และ 3 ต้องได้รับโดยปริยายประเภทส่งเสริมและสมดุลกับแต่ละอื่น ๆ ที่มีการแปลงทางคณิตศาสตร์ตามปกติ ( กฎการส่งเสริมประเภทโดยนัยใน C อธิบายไว้ที่นี่ ) ที่นี้หมายถึงว่าตัวถูกดำเนินการ 2 หรือ 3 จะเสมอint
เป็นอย่างน้อยที่มีขนาดใหญ่เป็น
ดังนั้นมันไม่สำคัญtrue
และfalse
เกิดขึ้นเป็นประเภทint
C เพราะนิพจน์มักจะให้ขนาดของint
เรื่องเป็นอย่างน้อย
แม้ว่าคุณจะเขียนนิพจน์ ซ้ำเป็นก็ยังคงส่งกลับขนาดของ!sizeof(a ? (bool)true : (bool)false)
int
นี่เป็นเพราะการส่งเสริมประเภทโดยนัยผ่านการแปลงเลขคณิตตามปกติ
sizeof(true)
และsizeof(false)
ยังเป็น 4: ide.geeksforgeeks.org/O5jvuN