2013-10-01 8 views
84

कृपया व्याख्या क्या, वास्तव में, तब होता है जब कोड के निम्न अनुभाग क्रियान्वित कर रहे हैं:वर्ण अक्षर में बच निकले नंबर की जावा सेमेन्टिक्स क्या हैं, उदा। ' 15'?

int a='\15'; 
System.out.println(a); 

इस 13 बाहर मुद्रण करता है;

int a='\25'; 
System.out.println(a); 

यह प्रिंट 21 से बाहर है;

int a='\100'; 
System.out.println(a); 

इस 64

+22

ऐसा लगता है कि यह संख्या को ऑक्टल के रूप में व्याख्या कर रहा है। – Nikhil

+5

'int a = '\ 15'' पहले ऑक्टल नंबर" 15 "(दशमलव 13, एक char के रूप में, यह ascii" कैरिज रिटर्न ") के आधार पर' char' बनाता है), जिसे आप फिर 'int' पूर्णांक में पुनः प्राप्त करते हैं । यह कानूनी है क्योंकि वर्ण 16 बिट पूर्णांक हैं, इसलिए यह एक सुरक्षित अपस्टास्ट है और जावा द्वारा कास्टिंग के बारे में कोई नोटिस जारी नहीं किया जाता है। अन्य उत्तरों पहले से ही पूरे ऑक्टल/दशमलव चीज को कवर करते हैं। –

+3

संभव डुप्लिकेट [जावा में वैध वर्ण अक्षर '\ 117' क्यों है?] (Http://stackoverflow.com/questions/14950593/why-is-117-a-valid-character-literal-in-java) – gparyani

उत्तर

115

आप एक चरित्र शाब्दिक, जिसे एकल कोट द्वारा सीमांकित किया जाता है सौंपा है, बाहर प्रिंट जैसे 'a' (, एक स्ट्रिंग शाब्दिक, जो दोहरे उद्धरण चिह्नों द्वारा सीमांकित किया जाता है से अलग रूप में जैसे "a") int चर के लिए। जावा 16-बिट हस्ताक्षरित char से 32-बिट हस्ताक्षरित int पर एक स्वचालित चौड़ाई कास्ट करता है।

हालांकि, जब एक वर्ण शाब्दिक बैकस्लैश 1-3 अंकों के बाद होता है, तो यह octal (base/radix 8) चरित्र का प्रतिनिधित्व करता है। इस प्रकार:

  • \15 = 1 × 8 + 5 = 13 (एक गाड़ी वापसी, एक ही '\r' के रूप में)
  • \25 = 2 × 8 + 5 = 21 (एक NAK चार - नकारात्मक पावती)
  • \100 = 1 × 64 + 0 × 8 + 0 = 64 (@ प्रतीक, एक ही '@' के रूप में)

चरित्र शाब्दिक अधिक जानकारी के लिए और दृश्यों से बचने, देखें JLS वर्गों:

का हवाला देते हुए BNF 3.10.6 से:

OctalEscape: 
    \ OctalDigit 
    \ OctalDigit OctalDigit 
    \ ZeroToThree OctalDigit OctalDigit 

OctalDigit: one of 
    0 1 2 3 4 5 6 7 

ZeroToThree: one of 
    0 1 2 3 
+3

मुझे इसे धारा 3.10.1 में नहीं मिला .. यह 3.10.4 में है, कैरेक्टर लिटल –

+1

पूर्णांक अक्षर पर अनुभाग अप्रासंगिक है। देखें [धारा 3.10.4] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.4)। यह भी देखें [धारा 3.10.6] (http://docs.oracle।कॉम/जावा/चश्मा/जेएलएस/से 7/एचटीएमएल/जेएलएस-3. एचटीएमएल # जेएलएस-3.10.6) चरित्र और स्ट्रिंग एस्केप दृश्यों के लिए। –

+0

'1-3 अंक' - यह' 0-3' होना चाहिए था। और यह 3 अंकों के अंडाकार के लिए, दो अंक ऑक्टल अभी भी '0-7' से हो सकता है। पूर्व। '\ 77' अभी भी मान्य है। – Jayamohan

19

अंकन \nnn जावा में एक अष्टाधारी चरित्र कोड को दर्शाता है। इसलिए int a = '\15' ऑक्टल वर्ण 15 से a का ऑटो-कास्ट मान निर्दिष्ट करता है जो दशमलव 13.

+5

नोटेशन '\ nnn' _not_ जावा में एक ऑक्टल संख्या को इंगित करता है। ओपी के कोड में, यह एक ऑक्टल चरित्र भागने अनुक्रम को दर्शाता है। आसपास के उद्धरण चिह्न आवश्यक हैं। तब चरित्र को असाइनमेंट द्वारा पूर्णांक मान में बढ़ाया जाता है। (ऑक्टल संख्याओं को एक प्रमुख शून्य अंक से दर्शाया जाता है।) –

+0

अच्छा बिंदु; जवाब में ऑटो-कास्ट का उल्लेख किया जाना चाहिए था। उत्तर अपडेट किया गया। –

6

तथ्य यह है कि आपने उद्धरणों में अंक डाले हैं, मुझे संदेह है कि यह संख्या को अक्षर के रूप में वर्णित कर रहा है। अनुसरण करने वाले अंक ऑक्टल में होना चाहिए।

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