คำถามนี้อาจฟังดูเป็นใบ้ แต่ทำไม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 หมายถึงจริงและสิ่งอื่นใดที่เป็นเท็จ