2009-03-03 20 views
30

क्यों करता है:डबल ए = ए + इंट बी और int + + डबल बी के बीच क्या अंतर है?

public class Addition { 
    public static void main() { 
    int a = 0; 
    double b = 1.0; 
    a = a + b; 
    System.out.println(a); 
    } 
} 

संकलन नहीं लेकिन:

public class Addition { 
    public static void main() { 
    int a = 0; 
    double b = 1.0; 
    a += b; 
    System.out.println(a); 
    } 
} 

संकलित करता है।

उत्तर

23

पूर्णांक = पूर्णांक + दोगुना अनिवार्य है

पूर्णांक = डबल + डबल

और आप ऐसा नहीं कर सकते कि कास्टिंग ...

पूर्णांक + = डबल बलों को पूर्णांक में जबकि करने के लिए परिणाम के बिना दूसरे को कास्टिंग की आवश्यकता है।

तो एक = (int) (ए + बी);

संकलित करना चाहिए।

संपादित करें: http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.26.2

+0

क्या आप आगे पढ़ने के लिए उस पर कुछ लिंक प्रदान कर सकते हैं? धन्यवाद – hhafez

+0

मुझे लगता है कि "गहरा" कारण यह है क्योंकि इसे संकुचित करते समय असाइन करने की अनुमति नहीं है: बाइट = int अस्वीकृत है और int = double भी है। क्या कोई एक साधारण बाइट एक करेगा; एक + = 2; और संकलन करने में विफल, लोग जावा में जूते फेंक देंगे। लेकिन मुझे अभी भी अतिरिक्त नियम पसंद आएंगे जो इसे बिना कलाकार के काम करते हैं :( –

+0

मुझे यकीन नहीं है कि एक गहरा कारण है, लेकिन जावा भाषा विनिर्देश स्पष्ट रूप से निहित कलाकार को परिभाषित करता है: http://java.sun.com/ दस्तावेज़/पुस्तकें/jls/second_edition/html/expressions.doc.html # 5304 – DefLog

32

जावा + = ऑपरेटर में करने के लिए एक अंतर्निहित डाली है: के रूप में टिप्पणी में अनुरोध किया ... यहाँ और अधिक पढ़ने के लिए एक लिंक (नहीं सबसे आसान पढ़ा है, लेकिन सबसे सही जानकारी) है बाएं हाथ का प्रकार। यह सभी रचना ऑपरेटर के लिए चला जाता है।

+1

मुझे लगता है कि यह एक संक्षिप्त संक्षिप्त उत्तर है –

4

डबल + पूर्णांक डबल देता है, तो डबल = डबल + पूर्णांक वैध है, दूसरे हाथ पर आदिम रूपांतरण चौड़ा पूर्णांक = डबल + पूर्णांक "आदिम रूपांतरण संकुचन" है JLS 5.1.2 देख सकते हैं और स्पष्ट डाली

की आवश्यकता है
0

जैसा कि पहले से ही कहा गया है, + = का एक निहित कलाकार है। यह स्पष्ट करने में सहायता के लिए, मैं एक ऐप का उपयोग करने जा रहा हूं जिसे मैंने कुछ समय पहले लिखा था जो इस प्रकार के प्रश्नों के लिए बिल्कुल सही है। http://javabytes.herokuapp.com/

और उनके अर्थ की एक तालिका: http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings

तो चलो कुछ सरल जावा कोड से बाईटकोड पर एक नज़र डालें:

यह तो आप वास्तविक बाईटकोड कि उत्पादन किया जा रहा है की जाँच कर सकते हैं एक ऑनलाइन disassembler है
int i = 5; 
long j = 8; 
i += j; 

डिस्सेबल कोड। मेरी टिप्पणियों के सामने // // होगा।

Code: 
     0: iconst_5 //load int 5 onto stack 
     1: istore_0 //store int value into variable 0 (we called it i) 
     2: ldc2_w #2; //long 8l 
        //load long 8 value onto stack. Note the long 8l above 
        //is not my comment but how the disassembled code displays 
        //the value long 8 being used with the ldc2_w instruction 
     5: lstore_1 //store long value into variable 1 (we called it j) 
     6: iload_0 //load int value from variable 0 
     7: i2l  //convert int into a long. At this point we have 5 long 
     8: lload_1 //load value from variable 1 
     9: ladd  //add the two values together. We are adding two longs 
        //so it's no problem 
     10: l2i  //THIS IS THE MAGIC. This converts the sum back to an int 
     11: istore_0 //store in variable 0 (we called it i) 
संबंधित मुद्दे