2015-11-10 8 views
9

मैं सोच रहा हूँ क्यों इस कोड संकलन नहीं करता है:जावा अभिव्यक्ति संकलन त्रुटि

int x=-3; 
    System.out.println(x-----x); 

जबकि इस कोड को करता है:

int x=-3; 
    System.out.println(x--- --x); 

मुझे लगता है कि प्राथमिकता पूर्व के लिए है और फिर decrements पोस्ट तो घटाव लागू किया जाना चाहिए।

+1

x --- x और x-- - x के बीच एक अंतर है। संकलक को यह जानना चाहिए कि क्या आपका मतलब x - --x या x-- - x है? – Stultuske

उत्तर

12

x-----x से बाएं से दाएं मूल्यांकन किया जाता है:

((x--)--)-x 

पहले x-- रिटर्न -3, और आप एक पर -- ऑपरेटर लागू नहीं कर सकते मूल्य (-3), केवल एक चर (जैसे एक्स) पर।

यही कारण है कि आपको Invalid argument to operation ++/-- त्रुटि मिलती है।

आप एक अंतरिक्ष जोड़ते हैं - x--- --x

यह रूप में (x--)- (--x)

   -3 - -5 = 2 
+0

क्या ऐसा कोई कारण है कि इसे 'x -----' का मूल्यांकन करने के लिए चुना गया था (x -) -) - 'और नहीं '(एक्स -) -) - '? – Keale

+0

क्या हम इसे उत्तर में जोड़ सकते हैं? : 3 – Keale

+3

@ किले। नहीं, क्योंकि ऑपरेटर की प्राथमिकता के साथ इसका कोई लेना-देना नहीं है। ऑपरेटर प्राथमिकता केवल तब होती है जब हम पहले से ही जानते हैं कि कौन से ऑपरेटरों इनपुट में स्थिति में हैं, और यहां संदिग्ध है। – Hoopje

0

पहला उदाहरण एक घटाव

int x=-3; 
System.out.println(x-----x); 

दूसरा एक की तरह है की तरह है कम से कम एक्स -> अपनी ही तरह

x++ => x=x+1 

तुमने किया क्या वहाँ

x-- => x=x-1 
की तरह कुछ है

और दूसरा भाग:

--x 

पहले घटाना है -1 चर

+2

यह सवाल का जवाब नहीं देता है। –

+0

@ उमाकांत आपके पास सही है, लेकिन मैंने इस स्पष्टीकरण के बाद इसे स्पष्ट किया –

4

x-----x(x--) -- -x के रूप में पार्स किया गया है का मूल्यांकन किया गया है, और यहाँ -- एक अभिव्यक्ति है जो एक चर नहीं है करने के लिए लागू किया जाता है। इसकी अनुमति नहीं है।

इसका कारण निम्न है। पार्सिंग में पहला चरण इनपुट स्ट्रीम को टोकन करना है: इनपुट स्ट्रीम, जिसमें वर्ण होते हैं, को टुकड़ों में समूहीकृत किया जाता है जिन्हें टोकन कहा जाता है। टोकन तार हैं जो जावा के लिए सार्थक हैं, उदा। कीवर्ड, ऑपरेटर, या पहचानकर्ता।

टोकनिंग लालची: जब तक एक और चरित्र टोकन में जोड़ा जा सकता है जैसे कि यह अभी भी वैध टोकन है, तो चरित्र जोड़ा जाता है। इस प्रकार, उदाहरण के लिए forLoop को एक पहचानकर्ता के रूप में माना जाता है, न कि कीवर्ड for के बाद पहचानकर्ता Loop

तार - और -- जावा में मान्य टोकन दोनों हैं। तो जब टोकननाइज़र --- से मुठभेड़ करता है, तो यह पहला अक्षर पढ़ता है। हालांकि यह जानता है कि - एक मान्य टोकन है, यह पहले अगले चरित्र को देखता है, और यह तय करता है कि -- एक मान्य टोकन भी है, इसलिए पहला टोकन लौटाया जाएगा --, - नहीं।

4

यह सीधे जावा भाषा विशिष्टता से आच्छादित है, §3.2. Lexical Translations

सबसे लंबे समय तक संभव अनुवाद प्रत्येक चरण में प्रयोग किया जाता है, भले ही परिणाम अंततः एक सही कार्यक्रम जबकि एक अन्य शाब्दिक अनुवाद होता नहीं है। एक अपवाद है: यदि किसी प्रकार के संदर्भ में लेक्सिकल अनुवाद होता है (§4.11) और इनपुट स्ट्रीम में दो या अधिक लगातार > वर्ण होते हैं जो गैर-> वर्ण के बाद होते हैं, तो प्रत्येक > वर्ण को संख्यात्मक के लिए टोकन में अनुवादित किया जाना चाहिए तुलना ऑपरेटर >

इनपुट पात्रों a--b tokenized कर रहे हैं (§3.5) के रूप में a, --, b, जो किसी भी व्याकरण की दृष्टि से सही कार्यक्रम का हिस्सा नहीं है, यहां तक ​​कि tokenization हालांकि a, -, -, b एक व्याकरण की दृष्टि से सही का हिस्सा हो सकता कार्यक्रम।

इस के बाद से

तो एक प्रकार संदर्भ नहीं है और के बारे में > नहीं वर्ण या तो, सबसे लंबे समय तक टोकन का नियम लागू होता है। तो x-----x को x, --, --, -, x उद्धृत उदाहरण की तरह टोकननाइज़ किया गया है।

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