คำถามนี้อาจฟังดูเป็นใบ้ แต่ทำไม0ประเมินfalseและค่าอื่น ๆ [จำนวนเต็ม] trueเป็นภาษาโปรแกรมส่วนใหญ่
การเปรียบเทียบสตริง
เนื่องจากคำถามดูเหมือนจะง่ายเกินไปฉันจะอธิบายตัวเองมากกว่านี้ก่อนอื่นอาจเห็นได้ชัดจากโปรแกรมเมอร์ทุกคน แต่ทำไมไม่มีภาษาการเขียนโปรแกรม - อาจมี แต่ไม่มี ฉันใช้ - ซึ่งเป็น0ค่าที่ประเมินtrueและ [จำนวนเต็ม] อื่น ๆ เพื่อfalseที่ไหน คำพูดหนึ่งอาจดูสุ่ม แต่ฉันมีตัวอย่างเล็ก ๆ น้อย ๆ ที่มันอาจเป็นความคิดที่ดี ก่อนอื่นเราลองมาดูตัวอย่างของการเปรียบเทียบสามสายผมจะเอา C มาstrcmpเป็นตัวอย่าง: โปรแกรมเมอร์ที่ลอง C เป็นภาษาแรกของเขาอาจถูกล่อลวงให้เขียนโค้ดต่อไปนี้:
if (strcmp(str1, str2)) { // Do something... }
เนื่องจากstrcmpส่งคืน0ซึ่งประเมินว่าfalseเมื่อใดที่สตริงมีค่าเท่ากันสิ่งที่โปรแกรมเมอร์เริ่มต้นพยายามทำล้มเหลวอย่างน่าสังเวชและโดยทั่วไปเขาไม่เข้าใจว่าทำไมในตอนแรก มีการ0ประเมินผลtrueแทนฟังก์ชันนี้สามารถใช้ในการแสดงออกที่ง่ายที่สุด - อย่างใดอย่างหนึ่งข้างต้น - เมื่อเปรียบเทียบกับความเสมอภาคและการตรวจสอบที่เหมาะสมสำหรับ-1และ1จะทำได้เมื่อจำเป็นเท่านั้น เราจะพิจารณาประเภทการคืนเป็นbool(ในความคิดของเราฉันหมายถึง) ส่วนใหญ่เวลา
นอกจากนี้ขอแนะนำชนิดใหม่signที่ใช้เวลาเพียงค่า-1, และ0 1ที่สามารถมีประโยชน์สวย ลองนึกภาพว่ามีโอเปอเรเตอร์ยานอวกาศใน C ++ และเราต้องการมันstd::string(ดีมีcompareฟังก์ชั่นอยู่แล้ว แต่โอเปอเรเตอร์ยานอวกาศสนุกกว่า) การประกาศจะเป็นดังต่อไปนี้:
sign operator<=>(const std::string& lhs, const std::string& rhs);
ได้0รับการประเมินtrueแล้วผู้ประกอบการยานอวกาศจะไม่มีอยู่จริงและเราอาจประกาศอย่างoperator==นั้นได้:
sign operator==(const std::string& lhs, const std::string& rhs);
สิ่งนี้operator==จะมีการจัดการเปรียบเทียบสามทางในคราวเดียวและยังสามารถใช้เพื่อทำการตรวจสอบต่อไปนี้ในขณะที่ยังสามารถตรวจสอบว่าสตริงใดที่เป็น lexicographically
if (str1 == str2) { // Do something... }
การจัดการข้อผิดพลาดเก่า
ตอนนี้เรามีข้อยกเว้นดังนั้นส่วนนี้ใช้เฉพาะกับภาษาเก่าที่ไม่มีสิ่งนั้นอยู่ (ตัวอย่างเช่น C) ถ้าเราดูไลบรารี่มาตรฐานของ C (และ POSIX อันเดียวกัน) เราจะเห็นได้ว่าฟังก์ชั่น maaaaany จะกลับมาอีก0ครั้งเมื่อประสบความสำเร็จและจำนวนเต็มอื่น ๆ ฉันได้เห็นบางคนทำสิ่งนี้:
#define TRUE 0
// ...
if (some_function() == TRUE)
{
// Here, TRUE would mean success...
// Do something
}
หากเราคิดเกี่ยวกับวิธีคิดในการเขียนโปรแกรมเรามักจะมีรูปแบบการให้เหตุผลต่อไปนี้:
Do something
Did it work?
Yes ->
That's ok, one case to handle
No ->
Why? Many cases to handle
ถ้าเราคิดเกี่ยวกับมันอีกครั้งก็จะได้ทำให้ความรู้สึกที่จะใส่เฉพาะค่าเป็นกลาง0เพื่อyes(และนั่นคือวิธีการทำงานของ C ทำงาน) ในขณะที่ค่าอื่น ๆ noทุกคนสามารถจะมีการแก้หลายกรณีของ อย่างไรก็ตามในทุกภาษาโปรแกรมที่ผมรู้ว่า (อาจจะยกเว้นบางภาษา esotheric ทดลอง) ที่yesประเมินfalseในifสภาพในขณะที่ทุกกรณีที่จะประเมินno trueมีหลายสถานการณ์เมื่อ "ทำงาน" หมายถึงหนึ่งกรณีขณะที่ "ไม่ทำงาน" หมายถึงสาเหตุที่เป็นไปได้มากมาย ถ้าเราคิดแบบนั้นการ0ประเมินtrueและส่วนที่เหลือfalseจะทำให้เข้าใจได้มากกว่า
ข้อสรุป
ข้อสรุปของฉันคือคำถามดั้งเดิมของฉัน: ทำไมเราจึงออกแบบภาษาที่0เป็นfalseและค่าอื่น ๆtrueโดยคำนึงถึงตัวอย่างของฉันด้านบนและอาจจะมากกว่าฉันไม่ได้คิด?
การติดตามผล:เป็นเรื่องดีที่ได้เห็นว่ามีคำตอบมากมายเกี่ยวกับความคิดมากมายและเหตุผลที่เป็นไปได้ที่จะเป็นเช่นนั้น ฉันรักความหลงใหลที่คุณมีต่อมัน ฉันเริ่มถามคำถามนี้ด้วยความเบื่อ แต่เนื่องจากคุณดูน่าหลงใหลมากฉันเลยตัดสินใจเพิ่มอีกซักนิดและถามถึงเหตุผลเบื้องหลังตัวเลือก Boolean สำหรับ 0 และ 1ใน Math.SE :)
if true ; then ... ; fiที่trueเป็นคำสั่งที่ส่งกลับศูนย์นี้และบอกว่าจะเรียกใช้if ...
boolประเภท แต่เปรียบเทียบ / ถ้าเงื่อนไขอื่น ๆ สามารถมีค่าตอบแทนใด ๆ
strcmp()ไม่ใช่ตัวอย่างที่ดีสำหรับจริงหรือเท็จเนื่องจากมันคืนค่าที่แตกต่างกัน 3 ค่า และคุณจะประหลาดใจเมื่อคุณเริ่มใช้เชลล์โดยที่ 0 หมายถึงจริงและสิ่งอื่นใดที่เป็นเท็จ