เกี่ยวกับประเภทบูลีนใน 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)จะให้ขนาดเป็นintC แต่มีขนาดเป็นboolC ++
เกี่ยวกับตัวดำเนินการตามเงื่อนไข ?:
ตัวดำเนินการแบบมีเงื่อนไข?:เป็นตัวดำเนินการที่แปลกและมีนิสัยแปลก ๆ มันเป็นความผิดพลาดที่จะเชื่อว่ามันเป็น 100% if() { } else {}เทียบเท่ากับ ไม่มาก
มีจุดลำดับระหว่างการประเมินตัวถูกดำเนินการที่ 1 และ 2 หรือ 3 ตัว?:ดำเนินการได้รับการรับประกันว่าจะประเมินเฉพาะตัวถูกดำเนินการที่ 2 หรือ 3 ดังนั้นจึงไม่สามารถเรียกใช้ผลข้างเคียงใด ๆ ของตัวถูกดำเนินการที่ไม่ได้รับการประเมิน รหัสเหมือนจะไม่ดำเนินการtrue? func1() : func2() func2()จนถึงตอนนี้ดีมาก
แต่มีกฎพิเศษที่ระบุว่าตัวถูกดำเนินการ 2 และ 3 ต้องได้รับโดยปริยายประเภทส่งเสริมและสมดุลกับแต่ละอื่น ๆ ที่มีการแปลงทางคณิตศาสตร์ตามปกติ ( กฎการส่งเสริมประเภทโดยนัยใน C อธิบายไว้ที่นี่ ) ที่นี้หมายถึงว่าตัวถูกดำเนินการ 2 หรือ 3 จะเสมอintเป็นอย่างน้อยที่มีขนาดใหญ่เป็น
ดังนั้นมันไม่สำคัญtrueและfalseเกิดขึ้นเป็นประเภทintC เพราะนิพจน์มักจะให้ขนาดของintเรื่องเป็นอย่างน้อย
แม้ว่าคุณจะเขียนนิพจน์ ซ้ำเป็นก็ยังคงส่งกลับขนาดของ!sizeof(a ? (bool)true : (bool)false) int
นี่เป็นเพราะการส่งเสริมประเภทโดยนัยผ่านการแปลงเลขคณิตตามปกติ
sizeof(true)และsizeof(false)ยังเป็น 4: ide.geeksforgeeks.org/O5jvuN