2011-10-06 17 views
5
byte b1 = 3; 
byte b2 = 0; 

b2 = (byte) (b2 + b1); // line 3 
System.out.println(b2); 

b2 = 0; 
b2 += b1;    // line 6 
System.out.println(b2); 

लाइन 3 पर, यह एक कंपाइलर त्रुटि है यदि हम परिणाम को बाइट में टाइप नहीं करते हैं - ऐसा इसलिए हो सकता है क्योंकि अतिरिक्त परिणाम हमेशा int और int में फिट नहीं होता है एक बाइट लेकिन स्पष्ट रूप से हमें लाइन 6 पर टाइपकास्ट करने की ज़रूरत नहीं है। क्या दोनों कथन, रेखा 3 और रेखा 6 समकक्ष नहीं हैं? यदि नहीं तो और क्या अलग है?बाइट्स

उत्तर

10

हां, दोनों पंक्तियां बराबर हैं - लेकिन वे भाषा के विभिन्न हिस्सों का उपयोग करते हैं, और वे जेएलएस के विभिन्न हिस्सों से ढके हुए हैं। लाइन 3 सामान्य + ऑपरेटर है, जो बाइट्स पर लागू होता है जिसे int पर प्रचारित किया गया है, जिससे int परिणाम दिया गया है। इसे byte वैरिएबल पर वापस सौंपने से पहले इसे कास्ट करना होगा।

रन समय, अभिव्यक्ति दो तरीकों में से एक में मूल्यांकन किया जाता है:

पंक्ति 6 ​​एक यौगिक असाइनमेंट ऑपरेटर section 15.26.2 of the JLS में वर्णित है। यदि बाएं हाथ की ऑपरेंड अभिव्यक्ति एक सरणी पहुंच अभिव्यक्ति नहीं है, तो चार चरणों की आवश्यकता है:

  • सबसे पहले, बाएं हाथ के ऑपरेंड का मूल्यांकन एक चर बनाने के लिए किया जाता है। यदि यह मूल्यांकन अचानक समाप्त हो जाता है, तो असाइनमेंट अभिव्यक्ति उसी कारण से अचानक समाप्त हो जाती है; दाएं हाथ के ऑपरेंड का मूल्यांकन नहीं किया जाता है और कोई असाइनमेंट नहीं होता है।
  • अन्यथा, बाएं हाथ के ऑपरेंड का मूल्य सहेजा गया है और फिर दाएं हाथ के ऑपरेंड का मूल्यांकन किया जाता है। यदि यह मूल्यांकन अचानक समाप्त हो जाता है, तो असाइनमेंट अभिव्यक्ति उसी कारण से अचानक समाप्त होती है और कोई असाइनमेंट नहीं होता है।
  • अन्यथा, बाएं हाथ के चर के सहेजे गए मूल्य और दाएं हाथ के ऑपरेंड के मूल्य का उपयोग यौगिक असाइनमेंट ऑपरेटर द्वारा संकेतित बाइनरी ऑपरेशन करने के लिए किया जाता है। यदि यह ऑपरेशन अचानक समाप्त हो जाता है, तो असाइनमेंट अभिव्यक्ति उसी कारण से अचानक समाप्त होती है और कोई असाइनमेंट नहीं होता है।
  • अन्यथा, बाइनरी ऑपरेशन का परिणाम बाएं हाथ के चर के प्रकार में परिवर्तित किया गया है, मान मानक रूपांतरण (§5.1.13) के अधीन उचित मानक मान सेट (एक विस्तारित-एक्सपोनेंट मान सेट नहीं)), और रूपांतरण का परिणाम चर में संग्रहीत किया जाता है।

यह अंतिम भाग (के रूप में हाइलाइट किया गया) है कि यह अलग बनाता है।

रूप E1 सेशन = E2 करने के लिए E1 = (टी) ((ई 1) सेशन बराबर है की एक यौगिक काम अभिव्यक्ति (:

वास्तव में, खंड की शुरुआत तुल्यता से पता चलता ई 2)), जहां टीई 1 का प्रकार है, सिवाय इसके कि ई 1 का मूल्यांकन केवल एक बार किया जाता है।

+1

कोई और प्रश्न नहीं, आपका सम्मान। – f1sh

+2

जॉन स्कीट द्वारा मेरा पहला प्रश्न उत्तर देने के लिए अच्छा लग रहा है :) – Zohaib

-2

जावा ने अभिन्न प्रकारों से जुड़े संचालन और रूपांतरणों पर गड़बड़ी की। सबसे अच्छी सलाह है, जब भी आप कर सकते हैं int का उपयोग करें। byte/short/char से बचें, किसी भी गणना से पहले उन्हें int पर स्पष्ट रूप से रूपांतरित करें।

+2

जॉन स्कीट ने "गड़बड़" कैसे काम करता है, इस बारे में एक बहुत अच्छी व्याख्या देने के बाद आप 2 घंटे क्यों पोस्ट करेंगे? कभी-कभी 'int' के अलावा अन्य प्रकारों का उपयोग करना समझ में आता है। – EboMike

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