क्या कोई कारण है कि Zsh सरणी का पहला तत्व 0 के बजाय 1 द्वारा अनुक्रमित किया गया है?


27

आधुनिक प्रोग्रामिंग और पटकथा भाषाओं के साथ मेरा अनुभव से, मेरा मानना है कि सबसे प्रोग्रामर आम तौर पर से एक सरणी के पहले तत्व की चर्चा करते हुए के आदि हैं 0 सूचकांक के रूप में। 1
का उपयोग करने में कोई पर्याप्त फायदे हैं ?

मुझे यकीन है कि मैंने Zsh के अलावा अन्य भाषाओं के बारे में सुना है, जो सरणियों के साथ समान व्यवहार करती हैं; यह मेरे हिसाब से ठीक है, क्योंकि यह उतना ही सुविधाजनक है।
हालाँकि, जैसा कि पहले जारी किया गया था और व्यापक रूप से शेल स्क्रिप्टिंग भाषाओं का उपयोग किया गया था जैसे कि ksh और bash सभी का उपयोग 0, कोई इस सामान्य "मानक" को बदलना क्यों पसंद करेगा?

मेरे प्रश्न का मेरा तत्काल उत्तर "निश्चित रूप से नहीं" होगा;
उसके बाद, केवल इस विवरण के बारे में मैं सोच सकता हूं कि गोले के लिए कुछ "विशेष सुविधा" के बारे में होगा " उन्होंने ऐसा सिर्फ अपने शांत खोल को थोड़ा अधिक दिखाने के लिए किया था "।

हालांकि, मुझे ज़श या उसके इतिहास के बारे में ज़्यादा जानकारी नहीं है, और इस बारे में मेरा तुच्छ सिद्धांत एक उच्च संभावना है, इसका कोई मतलब नहीं है।

क्या इसके लिए कोई स्पष्टीकरण है? या यह सिर्फ व्यक्तिगत स्वाद से बाहर है?



ऐतिहासिक कारण से, यह संभवतः से आया है csh, जिसने एक-आधारित सरणी अनुक्रमण का भी उपयोग किया है।
cuonglm

3
आजकल, श एक मानक भाषा है (कार्यान्वयन नहीं) जो विभिन्न संभावित दुभाषियों की है। Sh, bsh, ksh और yash जैसी sh के लिए उन व्याख्याकारों में से कुछ एक्सटेंशन के रूप में सरणियों का समर्थन करते हैं, लेकिन वे सिर्फ gcc की तरह भाषा का हिस्सा नहीं हैं, मानक C भाषा के लिए एक कंपाइलर मानक C भाषा पर एक्सटेंशन का समर्थन करता है। और सी की तरह, "श" दुभाषिया का कोई "आधिकारिक" कार्यान्वयन नहीं है।
स्टीफन चेज़लस


4
शायद विषय से थोड़ा हटकर, लेकिन प्रासंगिक। रोमियों ने समावेशी गिनती का उपयोग किया, शून्य के बजाय एक से घूरना। कल के बाद के दिन, हमारे लिए "दो दिन आगे", उनके लिए "तीन दिन आगे" था। वे आज शून्य नहीं बल्कि एक के रूप में गिने जाते हैं। परिणामस्वरूप जब उनके मिस्र के खगोलविदों ने हर चौथे वर्ष में एक लीप दिन की सिफारिश की, तो रोमियों ने वास्तव में इसे हर तीसरे वर्ष पेश किया, जो 45 ईसा पूर्व में शुरू हुआ था। त्रुटि को ठीक करने के लिए 12 ईसा पूर्व तक लिया गया था।
हैरी वेस्टन

जवाबों:


32
  • वस्तुतः सभी शेल एरेज़ (बॉर्न, csh, tsh, मछली, आरसी, तों, यश) 1 से शुरू होते हैं। ksh एकमात्र अपवाद है जो मुझे पता है (बस कॉपी किए गए ksh को बैश)।
  • समय में अधिकांश व्याख्या की भाषाओं (90 के प्रारंभिक दशक): awk, tclकम से कम, और उपकरणों के लिए आम तौर पर खोल से इस्तेमाल किया ( cut -f1-3, head -n 3, sort -k1,3, cal 1 2015, comm -1) 1. पर शुरू sed, ed, viसंख्या 1 से उनके लाइनों ...
  • zsh बोर्न शेल और csh का सबसे अच्छा लेता है। बोर्न शेल ऐरे की $@शुरुआत 1. zsh $@(बॉर्न में) या $argv(जैसे csh) की हैंडलिंग से होती है । देखें कि यह कितना भ्रामक है kshजहां ${@:0:1}आपको उदाहरण के लिए पहला स्थितीय पैरामीटर नहीं दिया गया है।
  • एक शेल प्रोग्रामिंग भाषा होने से पहले एक उपयोगकर्ता उपकरण है। यह सबसे उपयोगकर्ताओं के लिए पहला तत्व है के लिए समझ में आता है $a[1]। इसका अर्थ यह भी है कि तत्वों की संख्या अंतिम इंडिस के समान है (जैसे कि zsh में अधिकांश अन्य गोले में जैसे ksh, सरणियाँ विरल नहीं हैं )।
  • a[1]पहले तत्व a[-1]के लिए पिछले के साथ संगत है ।

तो IMO का प्रश्न यह होना चाहिए: डेविड कॉर्न के सिर में 0 से शुरुआत करने के लिए क्या मिला?


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

यहां पढ़ना: "जब लंबाई एन के अनुक्रम से निपटते हैं, तो जिन तत्वों को हम सबस्क्रिप्ट द्वारा अलग करना चाहते हैं, ... ए) उपज, जब सबस्क्रिप्ट 1 से शुरू होता है, तो सबस्क्रिप्ट सीमा 1 ≤ i <N + 1 से शुरू होती है; 0, हालांकि, अच्छे रेंज 0 however i <N . देता है। पता नहीं है कि क्या TROLL या STUPID है, लेकिन आप सरणियों पर 1 से शुरू होने वाले ग्राहकों के लिए "1 ≤ i" N "का उपयोग कर सकते हैं। सरणी स्कैन के अंत में उस +1 को डालने की कोई आवश्यकता नहीं है, और न ही देखने के बिंदु साबित करते हैं कि 1 या 0 के साथ अनुक्रमणिका शुरू करना बेहतर है।

1
आप या तो यह बता सकते हैं कि मानव ज्ञान में 0 को AFTER के साथ जोड़ा गया था, और इसने उस समय किसी तरह चीजों को गड़बड़ कर दिया। Theguardian.com/notesandqueries/query/0,5753,-1358,00.html - फिर, बस देखने की बात है :)

3
बॉर्न शैल सरणी $ @ 0 से शुरू होती है (1 नहीं) $ 0 उस प्रोग्राम का नाम है जिसे आप चला रहे हैं। आपको अपना तीसरा बिंदु सही करना चाहिए
एडवर्ड टॉर्वाड्स

2
@edwardtorvalds, नहीं, $0एक स्थितिगत पैरामीटर नहीं है। इसका हिस्सा नहीं है $@"$@"है "$1" "$2" ...। जब यह कार्य करने की बात आती है, तो कई गोले में, आप देखते हैं कि "$@"फ़ंक्शन के तर्क हैं, जबकि $0स्क्रिप्ट पथ (या शेल argv [0] जब कोई स्क्रिप्ट नहीं चल रहा है) रहता है
Stéphane Chazelas

7

मुझे लगता है कि इसका सबसे प्रशंसनीय जवाब है रिवर्स ऐरे से बिल्ट-इन zsh

यदि आपके पास 4 तत्वों के साथ एक सरणी है, तो कहने दें myvar=(1 2 3 4)और आप 4 तत्व तक पहुंचना चाहते हैं यह print $myvar[4]सही होगा?

हालाँकि, यदि आप एक लूप बनाना चाहते हैं जो इस सरणी के अंदर के तत्वों को पीछे की ओर सूचीबद्ध करेगा, तो यह केवल नकारात्मक अनुक्रमित का उपयोग करने की बात है:

print $myvar[-1]   # will print 4
print $myvar[-2]   # will print 3
print $myvar[-3]   # will print 2
print $myvar[-4]   # will print 1

इसे शून्य से शुरू करने के बाद से समझाना चाहिए, आप उन तत्वों में से एक तक नहीं पहुंचेंगे क्योंकि कोई भी नहीं है -0

इसके पीछे दूसरा कारण शायद, zsh पर चर से संबंधित C कोड है intया double intसरणी अनुक्रमित को परिभाषित करने के लिए, और चूंकि यह दो के पूरक का उपयोग करता है नकारात्मक संख्याओं का प्रतिनिधित्व करने का कोई तरीका नहीं है -0( हस्ताक्षरित शून्य ), जैसे आप फ्लोट पर कर सकते हैं। बिंदु चर।

यदि आप वास्तव में 0 से शुरू होने वाले अनुक्रमित के लिए उपयोग किए जाते हैं, तो मेरा सुझाव है कि आप KSH_ARRAYSइसे ठीक करने के लिए विकल्प का उपयोग करें।

और @cuonglm कमेंट का हुक लेते हुए, यहाँcsh पर लागू सुविधाओं zshको समझाया गया है । यह एक ऐतिहासिक कारण नहीं है, बल्कि उन लोगों के लिए एक आरामदायक वातावरण प्रदान करने का एक तरीका है, जिनके साथ उपयोग किया जाता हैcsh


3
फिर, इससे आपको एक ही समय में पहली और अंतिम सरणी वस्तुओं तक पहुंच बनाना चाहिए, एक सरणी को स्कैन करने के सभी तर्क को तोड़कर;) एक ब्लैकहोल भी बना सकता है। LOL

3
0-अनुक्रमित सरणियों के -साथ बदलें ~
माइकस

1
@mfxx - मैं बात कर रहा था bash। मुझे लगता है कि यह सिंटैक्स चीनी के रूप में सेट तत्वों के लिए नकारात्मक सूचकांकों को संभालता है , लेकिन फिर ऐसा नहीं करता है। याद नहीं आ रहा। मेरे दृष्टिकोण से, लोगों को बस एक निर्देशिका बनानी चाहिए और उन सभी के लिए फ़ाइलों का उपयोग करना चाहिए जो वे सभी शेल राज्य में भर रहे हैं। आप उन तत्वों को अनुक्रमित कर सकते हैं जो किसी भी तरह से आपको पसंद हैं।
22

1
~द्विआधारी उलटा है। ~0है -1। (सभी बिट्स फ़्लिप हो गए, यह निर्भर करता है कि नकारात्मक संख्याओं को आमतौर पर बिट-वार कैसे दर्शाया जाता है)। एक परेशान सरणी या इंडिस 0, [0], [-0], [-1] और [~ 0] के केवल एक तत्व के साथ एक सरणी आपको ksh-like सरणी में एक ही चीज़ देगी।
स्टीफन चेज़ेलस

1
@ स्टीफनचैलेजेलस - हाँ, मुझे लगता है कि मुझे यह याद है कि ~जब -indexकाम नहीं किया था तब इसे संभालना था। मुझे लगता है कि शायद सब मैंने किया था ~-index। हाँ। यह सही लगता है। हाँ! और निश्चित रूप से यह भी असंगत तत्वों के लिए काम करता है। इसलिए मुझे लगता है कि ऊपर की टिप्पणी होनी चाहिए - 0-अनुक्रमित सरणियों के लिए ~ । मुझे लगता है कि यह सिर्फ -1 हिस्सा आसान हो सकता है। मुझे नही पता। इस समय मेरी स्मृति में सबसे आगे नहीं कूद रहा है ...
mikeserv
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.