TL; DR
C สืบทอด!
และ~
ตัวดำเนินการจากภาษาอื่น ทั้งสอง&&
และ||
ถูกเพิ่มเข้ามาในอีกหลายปีต่อมาโดยบุคคลอื่น
คำตอบยาว ๆ
ในอดีต C พัฒนาจากภาษาต้น B ซึ่งอยู่บนพื้นฐานของ BCPL ซึ่งขึ้นอยู่กับ CPL ซึ่งขึ้นอยู่กับ Algol
Algol , ผู้ยิ่งใหญ่ของ C ++, Java และ C #, นิยามจริงและเท็จในแบบที่ทำให้รู้สึกว่าสัญชาตญาณของโปรแกรมเมอร์:“ ค่าความจริงซึ่งถือว่าเป็นเลขฐานสอง (จริงตรงกับ 1 และเท็จถึง 0), เช่นเดียวกับค่าสำคัญที่แท้จริง " อย่างไรก็ตามข้อเสียอย่างหนึ่งของเรื่องนี้ก็คือตรรกะและค่าบิตมินิไม่สามารถเป็นการดำเนินการแบบเดียวกันได้: ในคอมพิวเตอร์สมัยใหม่ใด ๆ~0
เท่ากับ -1 มากกว่า 1 และ~1
เท่ากับ -2 มากกว่า 0 (แม้แต่ในเมนเฟรมอายุหกสิบปีที่~0
แสดงถึง - 0 หรือINT_MIN
, ~0 != 1
บน CPU ทุกที่เคยทำและมาตรฐานภาษา C จำเป็นต้องมีมันเป็นเวลาหลายปีในขณะที่ส่วนใหญ่ของภาษาลูกสาวของตนไม่ได้รำคาญที่ให้การสนับสนุนการลงชื่อเข้าใช้และขนาดหรือ one's-สมบูรณ์ at all.)
อัลกอลทำสิ่งนี้โดยการมีโหมดที่แตกต่างกันและการตีความตัวดำเนินการต่างกันในโหมดบูลีนและอินทิกรั นั่นคือการดำเนินการระดับบิตคือหนึ่งในประเภทจำนวนเต็มและการดำเนินการทางตรรกะเป็นหนึ่งในประเภทบูลีน
BCPL มีประเภทบูลีนแยกต่างหาก แต่เป็นnot
โอเปอเรเตอร์เดียวสำหรับทั้งบิตและตรรกะไม่ใช่ วิธีที่ผู้เบิกทางก่อนหน้านี้ของ C ทำผลงานนั้นคือ:
ค่า Rvalue ของความจริงเป็นรูปแบบบิตที่ประกอบด้วยทั้งหมด Rvalue ของเท็จเป็นศูนย์
สังเกตได้ว่า true = ~ false
(คุณจะสังเกตว่าคำว่าrvalueได้พัฒนาขึ้นเพื่อหมายถึงบางสิ่งที่แตกต่างอย่างสิ้นเชิงในภาษาตระกูล C ปัจจุบันเราจะเรียกว่า "การแทนวัตถุ" ใน C. )
คำจำกัดความนี้จะอนุญาตให้ใช้ตรรกะและค่าบิตมิชชันไม่ให้ใช้คำสั่งภาษาเครื่องเดียวกัน ถ้า C #define TRUE -1
ได้ไปเส้นทางที่ส่วนหัวของไฟล์ทั่วโลกจะบอกว่า
แต่ภาษาการเขียนโปรแกรม Bนั้นถูกพิมพ์อย่างอ่อนและไม่มีประเภทบูลีนหรือแม้แต่ชนิดทศนิยม ทุกสิ่งทุกอย่างมีค่าเทียบเท่าint
กับตัวตายตัวแทนของตัวเอง C. สิ่งนี้ทำให้เป็นความคิดที่ดีสำหรับภาษาที่จะกำหนดว่าเกิดอะไรขึ้นเมื่อโปรแกรมใช้ค่าอื่นนอกเหนือจากจริงหรือเท็จเป็นค่าตรรกะ ก่อนอื่นนิยามนิพจน์ที่เป็นความจริงว่า“ ไม่เท่ากับศูนย์” สิ่งนี้มีประสิทธิภาพสำหรับมินิคอมพิวเตอร์ที่มันวิ่งซึ่งมีธงซีพียูเป็นศูนย์
ในขณะนั้นมีทางเลือก: ซีพียูตัวเดียวกันก็มีค่าสถานะเป็นลบและค่าความจริงของ BCPL คือ -1 ดังนั้น B อาจได้กำหนดจำนวนลบทั้งหมดเป็นความจริงและตัวเลขที่ไม่เป็นลบทั้งหมดเป็นเท็จ (มีสิ่งหนึ่งที่เหลืออยู่ของวิธีการนี้: การเรียกใช้ระบบจำนวนมากใน UNIX ที่พัฒนาโดยคนเดียวกันในเวลาเดียวกันกำหนดรหัสข้อผิดพลาดทั้งหมดเป็นจำนวนเต็มลบการโทรของระบบจำนวนมากส่งคืนหนึ่งในค่าลบที่แตกต่างกันหลายรายการ จะขอบคุณ: มันอาจจะเลวร้ายยิ่ง!
แต่กำหนดTRUE
เป็น1
และFALSE
เป็น0
ใน B หมายความว่าตัวตนtrue = ~ false
ไม่ได้จัดขึ้นและมันได้ลดลงพิมพ์ที่แข็งแกร่งที่ได้รับอนุญาต Algol จะกระจ่างระหว่างค่าที่เหมาะสมและการแสดงออกเชิงตรรกะ สิ่งนั้นต้องการโอเปอเรเตอร์ที่ไม่ใช่ตรรกะใหม่และผู้ออกแบบเลือก!
อาจเป็นเพราะไม่เท่ากับ - อยู่แล้ว!=
ซึ่งมีลักษณะเหมือนแถบแนวตั้งผ่านเครื่องหมายเท่ากับ พวกเขาไม่ได้ทำตามแบบแผนเดียวกัน&&
หรือ||
เพราะยังไม่มีใครเลย
เนื้อหาที่ควรมี: ตัว&
ดำเนินการใน B เสียตามที่ออกแบบไว้ ใน B และใน C 1 & 2 == FALSE
ถึงแม้ว่า1
และ2
เป็นทั้งค่าจริงและไม่มีวิธีที่ใช้งานง่ายเพื่อแสดงการดำเนินการเชิงตรรกะใน B นั่นคือข้อผิดพลาดหนึ่งที่ C พยายามที่จะแก้ไขบางส่วนโดยการเพิ่ม&&
และ||
แต่ข้อกังวลหลักในเวลานั้นคือ ในที่สุดทำให้การลัดวงจรทำงานและทำให้โปรแกรมทำงานได้เร็วขึ้น ข้อพิสูจน์เรื่องนี้คือไม่มี^^
: 1 ^ 2
เป็นคุณค่าที่แท้จริงแม้ว่าตัวถูกดำเนินการทั้งสองของมันเป็นความจริง แต่ก็ไม่สามารถได้รับประโยชน์จากการลัดวงจร