การนับเดือนตามศูนย์ [ปิด]


98

ภาษาการเขียนโปรแกรมยอดนิยมบางภาษาใช้การกำหนดหมายเลขเดือนซึ่งปิดด้วย 1 - JavaScript อยู่ในใจเช่นเดียวกับ Java และหากหน่วยความจำทำหน้าที่ C ก็เป็นอีกภาษาหนึ่ง ฉันมีคำถาม:

  • หากคุณกำลังจะเพิกเฉยต่อการใช้เลขเดือนที่คนทั่วไปใช้แล้วทำไมไม่เพื่อความสอดคล้องกันก็ละเว้นการนับวันที่คนทั่วไปใช้และนับวันในแต่ละเดือนโดยเริ่มจาก 0
  • ทำไมเรื่องนี้เป็นเรื่องธรรมดา
  • ความคิดนี้เป็นของใครตั้งแต่แรก?

อาร์เรย์เริ่มต้นที่ 0 และผู้คนอ้างถึงวันตามตัวเลข?
glasnt

13
@TomatoSandwich: ค่อนข้างบ่อยคนอ้างถึงเดือนโดยตัวเลขและพวกเขานับมันเริ่มต้นจาก1
Robert L

2
โปรแกรมเมอร์ API ไม่ใช่เทพเจ้า แต่อย่างใด บางครั้งเกิดข้อผิดพลาดในการใช้งาน เพียงแค่จัดการกับมัน ไม่ใช่ว่าเป็นกรณีอย่างนั้น (คุณไม่ได้พูดภาษาอะไร) แต่อย่าคาดหวังว่าทุกอย่างจะสมบูรณ์แบบ ฉันชื่นชมที่อยากรู้เหตุผลว่า
เที่ยงผ้าไหม

5
ในญี่ปุ่นพวกเขาใช้ตัวเลขเท่านั้น พวกเขาไม่ใช้เดือนมกราคมกุมภาพันธ์ ฯลฯ โลกตะวันตกยังใช้ตัวเลขบ่อยมาก ฉันหวังว่าพวกเขาจะไม่สร้างภาษาโปรแกรมอื่นที่เลือกรูปแบบอาร์เรย์เหนือรูปแบบภาษาพูดอีก มันเป็นวิธีแก้ไขง่ายๆสำหรับบางสิ่งที่จะถูกใช้เป็นล้าน ๆ ครั้ง
Wolfpack'08

1
เห็นด้วยแม้ว่าจะไม่ใช่ความผิดแขวนใครก็ตามที่ทำเช่นนี้เสียเวลาเพียงสิบนาทีและสมควรได้รับการตบด้วยปลาเปียกขนาดกลาง
James McCormack

คำตอบ:


53

การใช้ศูนย์เพื่อเริ่มการนับเป็นเคล็ดลับการเพิ่มประสิทธิภาพจากโปรแกรมเมอร์ Assembly แทนที่จะกำหนด 1 ให้กับการลงทะเบียนนับพวกเขา XOR'ed การลงทะเบียนด้วยตัวมันเองซึ่งเร็วกว่าเล็กน้อยในรอบ CPU นั่นหมายความว่าการนับจะเริ่มต้นด้วย 0 และจะขึ้นอยู่กับความยาวขององค์ประกอบเสมอยกเว้นอันสุดท้าย

นอกจากนี้การใช้ศูนย์ยังเป็นที่นิยมในการคำนวณทางคณิตศาสตร์ของตัวชี้ซึ่งคุณจะใช้ตัวชี้ฐานหนึ่งตัวชี้ไปที่หน่วยความจำที่จัดสรรบางส่วนรวมทั้งตัวชี้ตัวที่สองซึ่งจะอยู่ที่ค่าชดเชยจากตัวชี้ฐานนี้ ที่นี่การใช้ค่าศูนย์มีความสมเหตุสมผลมากที่จะชี้ออฟเซ็ตไปที่ฐานของบล็อกหน่วยความจำ (ตรรกะอาร์เรย์ทั่วไปมีแนวโน้มที่จะเป็นที่อยู่ฐานบวกขนาดเรกคอร์ด offset x)

และเลขเดือนตามศูนย์? บ่อยครั้งสภาพแวดล้อมการเขียนโปรแกรมจำนวนมากคำนวณข้อมูลเป็นจำนวนวันนับตั้งแต่ข้อมูลเริ่มต้นบางส่วน วันที่ 31 ธันวาคม พ.ศ. 2442 เป็นวันที่ได้รับความนิยมแม้ว่าจะมีการใช้วันที่อื่น ๆ เป็นวันฐานก็ตาม วันที่อื่น ๆ ทั้งหมดจะหักล้างจากฐานนี้และจะถูกจัดเก็บเป็นตัวเลขเดียว เศษส่วนจะใช้เพื่อระบุชั่วโมงนาทีและวินาทีโดยที่ 0.25 จะเป็น 24/4 = 6 ชั่วโมง ดังนั้นในการเปลี่ยนวันที่ให้เป็นวันที่จริงสภาพแวดล้อมทั้งหมดที่ต้องทำคือเปลี่ยนตัวเลขนี้ให้เป็นวันที่จริง

อย่างไรก็ตามการรวมกันของอาร์เรย์ที่ใช้ศูนย์และค่าเดือนตาม 1 จะทำให้เกิดปัญหา หากต้องการรับชื่อเดือนของเดือน 9 คุณจะต้องได้รับรายการ 8 จากอาร์เรย์เดือน นักพัฒนาบางคนพอใจกับการลดจำนวนเดือนก่อนที่จะได้รับชื่อ คนอื่น ๆ ชอบที่จะเปลี่ยนเดือนให้เป็นแบบศูนย์เนื่องจากผู้คนต้องการทราบชื่อไม่ใช่ตัวเลข มันเป็นมุมมองส่วนตัว


92
ตัวสร้างวันที่ของ JavaScript และ AS3 ใช้ค่าจริงสำหรับทุกอย่าง "ยกเว้น" เดือนซึ่งไม่ทราบเหตุผลที่ต้องระบุว่าอิงตามศูนย์ นั่นเป็นการออกแบบ API ที่แย่มากอย่างไม่ต้องสงสัย
Triynko

3
ฉันเห็นด้วย. นี่ทำให้ฉันเสียเวลาหนึ่งชั่วโมงในการพยายามหาสาเหตุว่าทำไมวันที่ของฉันถึงหมดไปหนึ่งเดือน มันไม่สมเหตุสมผลเลยที่ทุกอย่างจะเป็น 1 ตามยกเว้นเดือน น่าเสียดายที่มันอาจไม่สามารถแก้ไขได้มิฉะนั้นเราจะจบลงด้วยปัญหา Y2K อื่น :-)
ไมค์ทองคำ

1
tl; DR: เพราะของการค้นหาอาร์เรย์monthName[monthNumber]หรือmon_name[tm_mon]มีสัญกรณ์ time.h
Perseids

สิ่งที่ XOR กับตัวเองเป็นปลาเฮอริ่งสีแดง มันเป็นสิ่งที่ Intel MPU อื่น ๆ มีวิธีอื่นในการลงทะเบียนเป็นศูนย์ บางคนมีวิธีที่มีประสิทธิภาพในการตั้งค่าเป็น 1 เช่นกัน เหตุผลหลักสำหรับสิ่งที่เป็นศูนย์คือการคำนวณดัชนี บางครั้งก็มีประโยชน์สำหรับการคำนวณเช่นกัน
alastair

6

มันคืออะไรและซอฟต์แวร์ที่มีน้ำหนักมหาศาลที่สร้างขึ้นตามสมมติฐานนั้นหมายความว่ามันจะต้องใช้เวลาสักพัก

ความคิดเห็นของฉันคิดว่ามันเป็นความผิดของ C และภาษาอื่น ๆ ของจอห์นนี่ที่เพิ่งมาเมื่อเร็ว ๆ นี้ก็สอดคล้องกับมัน

คุณได้รับสถานการณ์ตลก ๆ จากคนที่ไม่รู้จักดีกว่า หนึ่งในจุดบกพร่องของ Y2K ที่ทีมงานของเราพบคือเว็บไซต์แห่งหนึ่งที่ประกาศปี 19100 ด้วยความภาคภูมิใจเพราะพวกเขานำหน้าstruct tmปีด้วย "19"


อย่างน้อยหนึ่งคน (ไม่ใช่ฉัน) ได้กำหนดฟังก์ชัน "getRealMonth" และ "setRealMonth" เพื่อใช้ในสคริปต์ของเขา ฉันไม่โทษเขาเลยสักนิด
Robert L

1
โหวตให้คะแนนสำหรับการอ้างอิงจุดบกพร่องของ Y2K
Justus Romijn

4

ใช่แล้วชาวโรมันก็มีปัญหากับศูนย์เช่นกัน

นี่เป็นเพียงผลลัพธ์ [ไม่ใช้งานง่าย] ของคณิตศาสตร์ (เป็นส่วนประกอบที่สำคัญของการเขียนโปรแกรมโดยเฉพาะการเขียนโปรแกรมในช่วงต้น) กำหนดศูนย์เป็นคำแรก (คำที่มีปัญหาว่าหนึ่ง) จำนวนจริงจริงบวก * และเนื่องจากอาร์เรย์ถูกสร้างดัชนีด้วยจริง ตัวเลขธรรมชาติองค์ประกอบ "แรก" อยู่ที่ดัชนี 0

เดือนเป็นค่าที่ตั้งชื่อตามจริงในอาร์เรย์โดยที่วันและปีเป็นค่าตัวเลขอาจมีประโยชน์มากกว่าที่จะคิดว่าวัน / ปีอยู่ในอาร์เรย์ซึ่งมีลักษณะเป็น {"1", "2", "3", .. } เอง

เหตุใดจึงเป็นเรื่องธรรมดา (นอกเหนือจากความถูกต้องทางคณิตศาสตร์) ภาษาทั้งหมดที่คุณระบุไว้นั้นสืบเชื้อสายมาจากแหล่งกำเนิดทั่วไปสำหรับสิ่งหนึ่ง ...

แก้ไข:

เมื่อพิจารณาเพิ่มเติมลิงก์วิกิพีเดียนี้ให้รายละเอียดเหตุผลที่ดีและน่าสนใจหลายประการสำหรับการจัดทำดัชนีเป็นศูนย์ (ซึ่งไม่ได้พูดโดยตรงว่าทำไมเดือนจึงมีดัชนีเป็นศูนย์ แต่ฉันคิดว่าครอบคลุมแล้ว) และลิงก์SOนี้ได้ตอบคำถามก่อนหน้านี้แล้ว

ดูเหมือนว่าความคิดเห็นที่เกิดขึ้นจะเป็น "อุบัติเหตุในอดีต" หรือ "เนื่องจากเดือนไม่ใช่ตัวเลขจึงไม่สามารถเทียบกับการจัดเก็บแบบวัน / ปีได้" ขึ้นอยู่กับว่าคุณถามใคร

* ขอโทษขอโทษฟิสิกส์! = คณิตศาสตร์กลับมากัดฉันที่นั่น ออกไปรีดมือฉันเดี๋ยวนี้


5
ศูนย์ไม่ใช่จำนวนบวก นอกจากนี้ยังไม่ใช่จำนวนลบ
Robert L

จุดที่ดีบางทีคุณควรเปลี่ยนเป็น "จำนวนธรรมชาติ"
paxdiablo

1
ที่น่าสนใจผมคิดเสมอว่า C อาร์เรย์เริ่มต้นที่ 0 เพื่อลดความซับซ้อนทางคณิตศาสตร์ตัวชี้: ==a[0] *(a + 0)
php มากเกินไป

2
จริงๆแล้วในการคำนวณคุณสามารถมีศูนย์บวกและลบได้หากคุณใช้ระบบเสริมของคน โชคดีที่ระบบนั้นแทบจะไม่ถูกนำมาใช้อีกเลย ดูen.wikipedia.org/wiki/Ones'_complement#Ones.27_complement
Wim ten Brink

เดือนก็เป็นตัวเลขเช่นเดียวกับวันในวัฒนธรรมของเรา เดือนแรกของปีเรียกว่า "1 (st) month" จริงๆและเดือนสุดท้ายเรียกว่า "12 (th) month"
Michael Tsang
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.