2011-12-04 14 views
24

इस उदाहरण में आउटपुट क्यों है?जावा सरणी - आउटपुट '1' क्यों है?

public static void main(String[] args){ 
int[] a = { 1, 2, 3, 4 }; 
int[] b = { 2, 3, 1, 0 }; 
System.out.println(a [ (a = b)[3] ]); 
} 

मैंने सोचा कि यह होगा। जैसे कि, अभिव्यक्ति के रूप में मूल्यांकन किया जाता है:

a[(a=b)[3]] 
a[b[3]] //because a is now pointing to b 
a[0] 

चाहिए एक [0] नहीं क्योंकि एक की ओर इशारा करते है?

अग्रिम धन्यवाद।

+3

मैन, सी के पास यह "अपरिभाषित व्यवहार" चीज़ के साथ इतना आसान है! अजीब शिक्षाओं के लिए – Kos

+2

+1! –

+1

ये कुछ प्रकार के प्रश्न हैं जो कुछ जावा परीक्षण या साक्षात्कारकर्ता पूछना पसंद करेंगे, भले ही कोई भी व्यक्ति जो कभी भी इस तरह कोड नहीं लिखता। – GreenieMeanie

उत्तर

16

जो मुझे weirded बाहर के साथ-साथ ... हालांकि, खंड 15.7.1 जाँच here

अनिवार्य रूप से अधिक, ऑपरेंड का मूल्यांकन बाएं से दाएं कर रहे हैं। लेकिन यह भी ध्यान दें:

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

+1

मैंने हमेशा सोचा कि ब्रैकेट का मूल्यांकन पहले किया जाता है - बॉडमास – ziggy

26

प्रत्येक ऑपरेटर के लिए तर्कों का मूल्यांकन बाएं से दाएं किया जाता है। I.e, a[...] के सामने इसकी सामग्री से पहले मूल्यांकन किया गया है, जिस बिंदु पर यह अभी भी पहले सरणी को संदर्भित करता है।

7
a [ (a = b)[3] ]) 

व्याख्या की है:

a = b => a = {2, 3, 1, 0}; 
(a = b)[3] => 0; 

यहाँ चाल यहाँ है: a मूल्यांकन किया जाता है के रूप में b से पहले मूल्य में डाला गया है।

a[(a = b)[3]) => a[0] = 1; 

जावा में ऑपरेटर प्राथमिकता के बारे में सोचें। यह थोड़ा और स्पष्ट होना चाहिए।

+0

-1: ओपी ने पूछा कि क्यों, आपने अभी दिखाया है कि जब आप निर्देशों को पुन: व्यवस्थित करते हैं तो 1 प्राप्त करना संभव है ... – Betlista

2

जैसा कि श्री मार्सेलो कैंटोस ने बताया, प्रत्येक ऑपरेटर के लिए तर्क बाएं से दाएं का मूल्यांकन किया जाता है। इसलिए यहां मैं क्या सोचता निष्पादन

a[(a=b)[3]] 

यहाँ है बाहरी 'एक' अपने तर्क (a = b) [3] का मूल्यांकन किया जाता लायेगा "1,2,3,4" और फिर है। इस प्रकार अब एक = बी और बी सरणी में इंडेक्स 3 पर तत्व लौटा दिया गया है जिसे एक द्वारा भी इंगित किया जाता है।

इसलिए हमें तर्क मूल्यांकन से '0' मिलता है। जैसा कि पहले कहा गया था, बाहरी अभी भी पुरानी सामग्री को संदर्भित करता है इस प्रकार एक [0] 1,2,3,4 सरणी देता है।

इसलिए हमें '1' मिलता है।

यह मेरी समझ है। अगर यह गलत है तो कृपया मुझे बताएं।

धन्यवाद,

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