2016-01-14 12 views
25

मुझे पता है कि इसी तरह के सवाल कई बार कहा गया है और वे अच्छी तरह से जवाब दिया गया लेकिन ... वे के बारे में शून्य लम्बाई सरणी के थे 1 आयाम की तरह:शून्य लंबाई बहुआयामी सरणी

int[] array = new int[0]; 

लगता है एक उद्देश्य है कि वहाँ इस तरह के सरणी के लिए जब नल का उपयोग नहीं किया जाना चाहिए/नहीं किया जा सकता है।

int[][][] multiDims = new int[5][0][9]; 
बेशक

सरल -1 डी मामले में लगता है कि हम इस तरह के सरणी से कुछ भी नहीं मिलता है अगर हम पुनरावृति या कुछ और करने के लिए कोशिश करते हैं और मैं केवल क्योंकि यह मेरे लिए अत्यंत बुरा लग रहा है पूछ रहा हूँ: लेकिन क्यों जावा है कि जैसी चीजों को बनाने के लिए अनुमति देता है। :-) ऐसे निर्बाध प्राणी के लिए कितनी मेमोरी आवंटित की जाती है?

+0

क्या आपका प्रश्न है * इसकी अनुमति क्यों है * या * कितनी मेमोरी आवंटित की जाती है *? – Manu

+9

डेवलपर्स हर समय व्यर्थ कोड लिखते हैं और डेवलपर के साथ आने वाले प्रत्येक व्यर्थ संयोजन का पता लगाना संभव नहीं है। –

+3

ऐसा प्रतीत होता है कि आप 'नया int [-1]' सफलतापूर्वक [ideone] (http://ideone.com/MtZLBs) संकलित भी कर सकते हैं (हालांकि यह निश्चित रूप से रनटाइम पर विफल रहता है)। यह त्रुटि की तरह दिखता है कि [Google की त्रुटि-प्रवण] (https://github.com/google/error-prone) जैसे टूल पकड़ने के लिए सेट हो सकते हैं (हालांकि ऐसा लगता है कि यह वर्तमान में नहीं है, शायद क्योंकि यह बस * भी * मूर्ख है)। –

उत्तर

31

जावा क्यों इसकी अनुमति देता है - भाषा के दृष्टिकोण से (अवधारणाओं को आप इसके साथ व्यक्त करने की कोशिश नहीं कर रहे हैं), इसे विशेष रूप से अस्वीकार क्यों करना चाहिए? यदि आप किसी भी प्रकार की शून्य-लंबाई सरणी की अनुमति देते हैं, तो विशेष रूप से int[9] की शून्य-लंबाई सरणी को अस्वीकार क्यों करें? इसे अस्वीकार करने के लिए मूल रूप से बेकार नियम लागू करने के लिए अधिक संकलक जांच की आवश्यकता होगी, क्योंकि नियम के बिना भी व्यवहार अच्छी तरह से परिभाषित किया गया है।

नीचे की रेखा, कंपाइलर चेक यह सुनिश्चित करने के लिए यहां नहीं हैं कि आपका प्रोग्राम समझ में आता है। वे यहां केवल अनजान जांचने के लिए हैं। जोड़ने के लिए


संपादित:

के रूप में एक टिप्पणी में कहा, इस तरह के जांच भी नहीं वास्तव में संभव है, क्योंकि सरणी लंबाई प्रकार की जानकारी का हिस्सा नहीं है और रन टाइम पर दिया जा सकता है। इसलिए, "विशेष मामला" के अलावा जब int[0] सीधे स्रोत कोड में होता है, तो कंपाइलर के पास यह जानने का कोई साधन नहीं है कि यह शून्य-लंबाई सरणी है या नहीं।

+0

यह 'int []' की शून्य-लंबाई सरणी है। आकार जावा में प्रकार का हिस्सा नहीं है। – immibis

+0

यह भी ध्यान दिया जाना चाहिए कि यह एक विशेष मामले का विशेष मामला है। आयाम को जावा में स्थिरांक होने की आवश्यकता नहीं है, इसलिए, संकलक को भविष्यवाणी करने में सक्षम होने के बिना इन संख्याओं को सरणी निर्माण अभिव्यक्ति में पारित करने का हमेशा एक तरीका होता है। और गतिशील मूल्यों के साथ, यह संयोजन संदर्भ में समझ में आता है। – Holger

+0

@ होल्गर अच्छा बिंदु, मैंने जवाब संपादित किया। यह अच्छी तरह से दिखाता है कि चेक न केवल अव्यवहारिक है बल्कि अक्सर असंभव है। –

23

यह 6 ऑब्जेक्ट्स - 5 खाली सरणी और इन सरणी वाले सरणी बनाएगा।

इसकी अनुमति क्यों है? 1-आयामी सरणी के मामले में इसी कारण से। आप इस तरह से एक सरणी बनाते हैं:

int[][][] multiDims = new int[p][q][r]; 

जहां प्रत्येक p, q और r कभी कभी 0 हो सकता है, इन विशेष मामलों से निपटने बहुत मुश्किल होगा। इसके बजाय आपको एक वैध वस्तु मिलती है जिसे लूप में उपयोग किया जा सकता है (एक बहुत छोटा लूप - एक जो तुरंत समाप्त होता है, लेकिन त्रुटियों के बिना)।

+1

आपका बिंदु विशेष मामलों की आवश्यकता से बचने से बचने के लिए एक अच्छा है। कई भाषा मानकों के रखरखाव इस दृष्टिकोण को मानते हैं कि यदि किसी विशिष्ट मामले में कुछ निर्माण निष्पादित करने से कोई उपयोगी उद्देश्य नहीं मिलेगा, तो इसका समर्थन करने का कोई कारण नहीं है, भले ही यह उपयोगी सामान्यीकरण की अनुमति दे, फिर भी मुझे उन स्थानों के उदाहरण देखना पसंद है जहां अनुमति ऐसे सामान्यीकरण उपयोगी है। ऐसी भाषा का एक उदाहरण जो इस तरह के उपयोग को परेशान करने की अनुमति देता है वह सी 99 है; यह रनटाइम पर गणना किए गए आकार के साथ सरणी घोषित करने की अनुमति देता है, लेकिन शून्य आकार के सरणी को घोषित करने के लिए अपरिभाषित व्यवहार का आह्वान करता है भले ही कोड ... – supercat

+0

... वास्तव में इसे वास्तव में एक्सेस करने का कोई प्रयास नहीं करता है (उदाहरण के लिए सरणी में सभी पहुंच है एक 'लूप' जिसका आकार कभी शून्य नहीं होने पर निष्पादित करता है), और सी में अनिर्धारित व्यवहार जावा में मौजूद किसी भी चीज़ से भी बदतर है, क्योंकि यह कंपाइलर्स को समय के सभी विचारों और खिड़की से बाहर निकलने की अनुमति देता है। – supercat

8

[5] लेकिन वास्तव में ऐसा कुछ उपयोगी: सबसे बाहरी सरणी लंबाई 0.

के साथ पांच तत्व सरणियों होगा लेकिन तुम सही [9] के बारे में कर रहे हैं। यह कुछ भी नहीं करता है: चूंकि सभी पांच मध्यवर्ती सरणी खाली हो जाएंगी, लंबाई 9 की कोई सरणी नहीं बनाई जाएगी। किसी भी पूर्णांक को बिल्कुल उसी प्रभाव में रखा जा सकता है।

भाषा को डिजाइन किया जा सकता था ताकि अगर आयाम के साथ एक स्तर का नेस्टेड सरणी था, तो 0 पर आयाम सेट किया गया था, तो बाद के सभी स्तरों को शाब्दिक 0 पर भी सेट करना होगा। लेकिन यह विनिर्देशन और कार्यान्वयन में एक और विशेष मामला पैदा करेगा और लाभ बहुत छोटा होगा।

+5

'[9]' वास्तव में एक उद्देश्य की सेवा कर सकता है। हो सकता है कि एक कार्यात्मक नहीं, लेकिन एक अर्थपूर्ण एक: इसका मतलब है कि सरणी का तीसरा आयाम * लंबाई 9 होना चाहिए, जो उपयोगी हो सकता है यदि आप तत्वों को जोड़ने की योजना बनाते हैं ताकि दूसरा आयाम खाली हो जाए। – Darkhogg

+0

@Darkhogg तत्काल –

+1

@ मैक्स के बाद जावा सरणी का आकार बदलना संभव नहीं है? आप रिक्त अरणों को गैर-रिक्त स्थान के लिए स्वैप कर सकते हैं। – Darkhogg

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