2009-09-21 11 views
89

कुछ लोकप्रिय प्रोग्रामिंग भाषाएं महीने की संख्या का उपयोग करती हैं जो 1 से बंद होती है - जावास्क्रिप्ट के रूप में जावास्क्रिप्ट दिमाग में आता है, और यदि स्मृति सेवा करता है, तो सी एक और है। मैं कुछ सवाल हैं:शून्य-आधारित महीना संख्या

  • आप laypeople द्वारा प्रयोग किया जाता महीने नंबरिंग अनदेखी होने जा रहे हैं, तो क्यों नहीं स्थिरता की खातिर भी दिन नंबर laypeople द्वारा प्रयोग किया जाता है, और संख्या पर ध्यान न दें प्रत्येक में दिन 0 से शुरू महीने?
  • यह इतना आम क्यों है?
  • पहली बार यह किसका विचार था?
+0

Arrays, 0 से शुरू होते हैं, और लोग संख्याओं से दिनों का उल्लेख करते हैं? – glasnt

+10

@ टमाटर सैंडविच: अक्सर लोग संख्याओं से _months_ का संदर्भ लेते हैं, और वे उन्हें _1_ से शुरू करते हैं। –

+2

एपीआई प्रोग्रामर रास्ते से देवता नहीं हैं; कभी-कभी गलतियों को लागू करने में मिलता है; बस उसके साथ निपटो। यह नहीं कि यह वास्तव में एक मामला है (आप यह भी नहीं कहें कि कौन सी भाषा है), लेकिन सबकुछ सही होने की उम्मीद न करें। हालांकि मैं इस कारण को जानना चाहता हूं। –

उत्तर

48

गिनती शुरू करने के लिए शून्य का उपयोग वास्तव में असेंबली प्रोग्रामर से ऑप्टिमाइज़ेशन चाल है। गिनती रजिस्टर में 1 को आवंटित करने के बजाय, उन्होंने स्वयं के साथ पंजीकरण किया, जो सीपीयू चक्रों में थोड़ा तेज था। इसका मतलब था कि गिनती 0 से शुरू होगी और आखिरी को छोड़कर, तत्वों की लंबाई तक हमेशा रहेगी।

इसके अलावा, शून्य का उपयोग पॉइंटर अंकगणित के साथ भी लोकप्रिय है जहां आप कुछ आवंटित स्मृति पर इंगित एक आधार सूचक का उपयोग करेंगे, साथ ही एक दूसरा पॉइंटर जो इस बेस पॉइंटर से ऑफसेट पर होगा। यहां, मान शून्य का उपयोग करके ऑफसेट को मेमोरी ब्लॉक के आधार पर इंगित करने के लिए बहुत सारी समझ होती है। (सामान्य सरणी तर्क मूल पता और ऑफसेट एक्स रिकॉर्ड आकार के रूप में होता है।)

और शून्य-आधारित महीनों की संख्या? अक्सर, कई प्रोग्रामिंग वातावरण डेटा को कुछ डिफ़ॉल्ट डेटा के बाद से कई दिनों के रूप में गणना करते हैं। 31 दिसंबर, 18 99 एक लोकप्रिय तिथि है, हालांकि आधार तारीख के रूप में उपयोग की जाने वाली कई अन्य तिथियां हैं। अन्य सभी तिथियां इस आधार से ऑफसेट हैं, और केवल एक ही नंबर के रूप में संग्रहित की जाएंगी। घंटे, मिनट और सेकंड इंगित करने के लिए फ्रैक्शंस का उपयोग किया जाएगा, जहां 0.25 24/4 = 6 घंटे होगा। इस प्रकार, किसी तारीख को वास्तविक तिथि में बदलने के लिए, सभी पर्यावरण को यह करना है कि इस नंबर को वास्तविक तिथि में बदल दें।

हालांकि, शून्य-आधारित सरणी और 1-आधारित महीने मानों का संयोजन एक समस्या लाता है। महीने 9 महीने का महीना नाम प्राप्त करने के लिए, आपको महीने सरणी से आइटम 8 प्राप्त करना होगा। कुछ डेवलपर्स इसका नाम प्राप्त करने से पहले महीने की संख्या घटाने से खुश होंगे। दूसरों ने महीने को शून्य-आधारित में बदलना पसंद किया क्योंकि लोग सिर्फ नाम जानना चाहते हैं, संख्या नहीं। यह एक व्यक्तिगत विचार है।

+79

देखें जावास्क्रिप्ट और एएस 3 दिनांक निर्माता महीने के "सब कुछ" के लिए वास्तविक मान लेते हैं, जो अज्ञात कारण के लिए शून्य-आधारित के रूप में निर्दिष्ट किया जाना चाहिए । यह निर्विवाद रूप से एक भयानक एपीआई डिजाइन है। – Triynko

+3

मैं सहमत हूं। यह सिर्फ मुझे पता लगाने की कोशिश कर रहा था कि मेरी तिथि एक महीने क्यों थी। महीने के अलावा यह सब कुछ 1 के आधार पर वास्तव में ज्यादा समझ में नहीं आता है। दुर्भाग्यवश, यह संभवतः अपरिहार्य है, अन्यथा हम एक और वाई 2 के समस्या के साथ समाप्त हो जाएंगे :-)। –

+1

टीएल; डॉ: सरणी लुकअप 'महीने नाम [महीना संख्या] 'या' mon_name [tm_mon] 'के साथ [time.h नोटेशन] (http://www.cplusplus.com/reference/ctime/asctime/)। – Perseids

4

यह वही है, और उस धारणा के लिए बनाए गए सॉफ़्टवेयर का विशाल वजन का मतलब है कि यह थोड़ी देर के लिए होगा।

मेरा राय यह है कि यह सी की गलती थी, और उन सभी अन्य जॉनी-आओ-हाल ही में भाषाएं इसके अनुरूप हैं।

आपको उन लोगों से कुछ मजेदार परिस्थितियां मिलती हैं जो बेहतर नहीं जानते हैं। हमारी टीम द्वारा मिली कुछ वाई 2 के कीड़े में से एक वेबसाइट पर गर्व से घोषणा करने वाली वेबसाइट थी, जो कि 1 9 100 थी क्योंकि उन्होंने शाब्दिक "1 9" के साथ struct tm वर्ष का उपसर्ग किया था।

+0

कम से कम एक व्यक्ति (मुझे नहीं) ने अपनी स्क्रिप्ट में उपयोग के लिए "getRealMonth" और "setRealMonth" फ़ंक्शंस को परिभाषित किया था। मैं उसे थोड़ा सा दोष नहीं देता हूं। Y12K बग संदर्भ के लिए –

+1

उपरोक्त। –

4

हां, रोमनों को भी शून्य के साथ समस्याएं थीं।

यह है सिर्फ एक [गैर सहज ज्ञान युक्त] गणित का परिणाम पहले के रूप में शून्य को परिभाषित (प्रोग्रामिंग के एक मजबूत घटक, विशेष रूप से जल्दी प्रोग्रामिंग जा रहा है) (समस्याग्रस्त शब्द है कि एक) असली, सकारात्मक * प्राकृतिक संख्या, और चूंकि एक सरणी वास्तविक, प्राकृतिक संख्याओं के साथ अनुक्रमित होती है, इसलिए "पहला" तत्व सूचकांक 0 पर होता है।

महीनों को वास्तव में एक सरणी में मूल्यों का नाम दिया जाता है, जहां दिन और वर्षों की संख्या गिना जाता है - यह शायद सोचने के लिए और अधिक उपयोगी होगा दिनों/वर्षों के सरणी में होने के नाते जो {"1", "2", "3", ...} की तरह दिखते हैं।

को यह क्यों इतना आम है अच्छी तरह से सभी भाषाओं आप सूचीबद्ध एक बात के लिए एक ही मूल के वंशज हैं (अलग गणितीय सही किया जा रहा से) के रूप में ...

संपादित करें:

इसे में आगे देख रहे हैं, यह wikipedia लिंक शून्य इंडेक्सिंग के लिए कई अच्छे और रोचक कारणों का विवरण देता है (जो सीधे बात नहीं करता है कि महीने शून्य-अनुक्रमित क्यों हैं लेकिन मुझे लगता है कि यह पहले से ही कवर है), और यह SO लिंक ने पहले प्रश्न का उत्तर दिया है।

ऐसा लगता है कि मौजूदा राय या तो "ऐतिहासिक दुर्घटना" या "क्योंकि महीनों की संख्या नहीं है इसलिए दिन/वर्ष भंडारण की तुलना नहीं की जा सकती है" जो आप पूछते हैं उसके आधार पर।

* क्षमा करें, क्षमा करें, भौतिकी! = गणित मुझे वापस काटने के लिए वापस आ रहे हैं। अब मेरे हाथ लोहे के लिए बंद करो।

+5

शून्य एक सकारात्मक संख्या नहीं है। यह भी ऋणात्मक संख्या नहीं है। –

+0

अच्छा बिंदु, शायद आपको इसे "प्राकृतिक संख्या" में बदलना चाहिए। – paxdiablo

+1

दिलचस्प, मैंने हमेशा सोचा था कि सी एरे पॉइंटर अंकगणितीय को सरल बनाने के लिए 0 पर शुरू होते हैं: 'a [0]' == '* (a + 0)'। –

संबंधित मुद्दे