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เป็นคุณค่าที่แท้จริงแม้ว่าตัวถูกดำเนินการทั้งสองของมันเป็นความจริง แต่ก็ไม่สามารถได้รับประโยชน์จากการลัดวงจร