"लघु तीस = 3 * 10" एक कानूनी कार्य क्यों है?


102

यदि shortस्वचालित रूप से intअंकगणितीय संचालन में पदोन्नत किया जाता है, तो क्यों है:

short thirty = 10 * 3;

shortचर के लिए एक कानूनी काम thirty?

बदले में, यह:

short ten = 10;
short three = 3;
short thirty = ten * three; // DOES NOT COMPILE AS EXPECTED

साथ में यह भी:

int ten = 10;
int three = 3;
short thirty = ten * three; // DOES NOT COMPILE AS EXPECTED

संकलित नहीं करता है क्योंकि किसी intमान को असाइन करने shortकी अनुमति के बिना कास्टिंग की अनुमति नहीं है।

क्या संख्यात्मक शाब्दिकों के बारे में कुछ खास चल रहा है?


23
short thirty = 10 * 3;संभवत: short thirty = 30;संकलक द्वारा प्रतिस्थापित किया जाता है जो कि एक मान्य कथन है। (मुझे प्रासंगिक JLS अनुभाग देखना होगा)।
थॉमस

संकलक 10 * 3परिणाम के साथ चर की गणना करता है और आरंभ करता है। आपके गैर-कामकाजी उदाहरण में गणना रनटाइम पर होती है जहां जेवीएम शॉर्ट डालता है।
फेलिक्स

मुझे लगता है कि यह एक डुप्लिकेट है, stackoverflow.com/questions/30346587/java-char-to-byte-casting या stackoverflow.com/questions/9379983/… । हालाँकि: ध्यान दें कि final int ten = 10; final int three = 3; short thirty = ten * three;ठीक संकलन करता है।
मार्को 13

7
If short is automatically promoted to int in arithmetic operations- यह प्रासंगिक नहीं है। न तो शॉर्ट्स हैं और न 10ही 3उन्हें बढ़ावा दिया जाता है, वे शाब्दिक हैं।
मैथ्यू पढ़ें

@MatthewRead: लेकिन यहां तक ​​कि शाब्दिक के रूप में, उन्हें एक विशेष डेटाटाइप के रूप में मूल्यांकन करना होगा, है ना? तो क्या यह सच है कि 10और संकलक द्वारा 3मूल्यांकन किया जाता है int?
लार्स

जवाबों:


139

क्योंकि संकलक 10*330 के साथ संकलन समय पर ही बदल देता है। तो, प्रभावी ढंग से:short thirty = 10 * 3 संकलन समय पर गणना की जाती है।

बदलने की कोशिश करो tenऔर threeकरने के लिएfinal short (उन्हें संकलन समय स्थिरांक बनाने) और देखो क्या होता: पी

javap -v दोनों वर्जन ( 10*3और final short) के लिए बाइट-कोड का परीक्षण करें । आप देख पाएंगे कि थोड़ा अंतर है।

ठीक है, तो, यहाँ विभिन्न मामलों के लिए बाइट कोड अंतर है।

मामला एक :

जावा कोड: मुख्य () {लघु एस = 10 * 3; }

बाइट कोड:

stack=1, locals=2, args_size=1
         0: bipush        30  // directly push 30 into "s"
         2: istore_1      
         3: return   

केस -2:

public static void main(String arf[])  {
   final short s1= 10;
   final short s2 = 3;
   short s = s1*s2;
}

बाइट कोड:

  stack=1, locals=4, args_size=1
         0: bipush        10
         2: istore_1      
         3: iconst_3      
         4: istore_2      
         5: bipush        30 // AGAIN, push 30 directly into "s"
         7: istore_3      
         8: return   

केस -3:

public static void main(String arf[]) throws Exception {
     short s1= 10;
     short s2 = 3;
     int s = s1*s2;
}

बाइट-कोड:

stack=2, locals=4, args_size=1
         0: bipush        10  // push constant 10
         2: istore_1      
         3: iconst_3        // use constant 3 
         4: istore_2      
         5: iload_1       
         6: iload_2       
         7: imul          
         8: istore_3      
         9: return 

उपरोक्त मामले में, 10और 3स्थानीय चर से लिया जाता है s1औरs2


17
Try changing ten and three to final shortव्यायाम पसंद है :)
सर्गेई Pauk

1
@SergeyPauk - यह संकलन समय स्थिरांक समझने में वास्तव में महत्वपूर्ण है .. सभी आदिम (स्ट्रिंग्स के साथ ही ..) पर लागू होता है :)
TheLostMind

1
@ TheLostMind मैं एक बेहतर शब्दों का सुझाव दूंगा कि you will see that there's no difference (between those two lines in the decompiled code)यह आपकी बात नहीं है?
सर्गेई पाऊक

4
जाहिर है, इसका मतलब यह भी है कि case 10*3:और समान एक स्विच निर्माण में कानूनी है।
गेको

5
और इसी तरह enum constructs में है। वास्तव में, बिटफील्ड एनम कॉन्स्टेंट के लिए 1 << 5 जैसे सामान का उपयोग करना मुहावरेदार है।
बाथशीबा

18

हां शाब्दिक मामले के साथ कुछ विशेष चल रहा है: संकलन समय 10 * 3पर मूल्यांकन किया जाएगा । तो आपको कई गुना शाब्दिक रूपांतरण की आवश्यकता नहीं है।(short)

ten * three इसलिए संकलन-समय मूल्यांकन योग्य नहीं है, इसलिए एक स्पष्ट रूपांतरण की आवश्यकता है।

यह एक अलग बात होगी tenऔर अगर threeइसे चिह्नित किया गया final


1

निम्नलिखित उत्तर जेएलएस अनुभाग और इस व्यवहार के बारे में कुछ विवरण जोड़ता है।

जेएलएस .215.2 के अनुसार - अभिव्यक्ति के रूप

कुछ अभिव्यक्तियों में एक मूल्य होता है जिसे संकलन समय पर निर्धारित किया जा सकता है। ये निरंतर अभिव्यक्तियाँ हैं (.215.28)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.