2011-01-10 15 views
7

जब मैं एक पोस्टफिक्स/उपसर्ग/कमी में लिखने का प्रयास करता हूं, उसके बाद/पोस्ट में उपसर्ग/कमी के बाद, मुझे निम्न त्रुटि मिलती है: ऑपरेशन के लिए अमान्य तर्क ++/-जावा में, मैं i ++++ या (i ++) ++ क्यों नहीं लिख सकता?

लेकिन, JLS के अनुसार:

PostIncrementExpression: 
     PostfixExpression ++ 

और

PostfixExpression: 
     Primary 
     ExpressionName 
     PostIncrementExpression 
     PostDecrementExpression 

इसलिए लिख:

PostfixExpression ++ ++ 

संभव हो जाना चाहिए ... किसी भी विचार?

+4

'i ++' वापसी क्या करता है? –

+5

क्या आपको नहीं लगता कि '- ++ ---- ++ var ++ ---- ++ - ++ 'थोड़ा उलझन में हो सकता है? – Crozin

+3

यह देखते हुए कि सी ++ की वृद्धि सी # है, क्या आपने 'i #' का उपयोग करने का प्रयास किया है? ;-) –

उत्तर

23

ध्यान दें कि कच्चे व्याकरण किसी भी अर्थ विज्ञान का अभाव है। यह सिर्फ वाक्यविन्यास है, और प्रत्येक वाक्य रचनात्मक रूप से वैध प्रोग्राम आमतौर पर मान्य नहीं होगा। उदाहरण के लिए, आवश्यकता से पहले चर को घोषित करने की आवश्यकता को आम तौर पर व्याकरण द्वारा कवर नहीं किया जाता है (आप कर सकते हैं, लेकिन यह बोझिल है)।

पोस्टफिक्स-वृद्धि एक रैल्यू उत्पन्न करती है - और जैसे ही आप पोस्टफिक्स-वृद्धि साहित्य नहीं कर सकते हैं, तो आप i++ के परिणाम को पोस्टफिक्स-वृद्धि नहीं कर सकते हैं।

JLS से हवाला देते हुए (। 3 वां एड, पेज 486):

The result of the postfix increment expression is not a variable, but a value.

+0

क्या आप व्याकरण में घोषणा-पहले-उपयोग को एन्कोड कर सकते हैं? किसी भी पहचानकर्ता के लिए किसी भी संख्या के लिए? – delnan

+0

@ डेलनान: वान विजिंगार्डन व्याकरण ऐसी चीजों के लिए कल्पना की गई थी, हां। लेकिन सभी व्यावहारिक उद्देश्यों के लिए, दो-स्तर के व्याकरण कमजोर हैं और आप इसे एक साधारण जिम्मेदार व्याकरण के साथ प्राप्त कर सकते हैं जो एएसटी को प्रचारित करने वाले दावों को परिभाषित करता है (यदि मुझे सही याद है, तो वह कक्षा के बाद से कुछ साल हो गया है)। – Joey

0

क्या आप (i ++) ++ द्वारा प्राप्त करने का प्रयास कर रहे हैं?

इसे दो बार बढ़ाता है !!

उपयोग लूपिंग एक पाश अंदर

वृद्धि :)

+3

उगघ। निश्चित रूप से 'i + = 2' लूप से बेहतर है। –

1

क्या ऐसे ऑपरेशन का परिणाम होना चाहिए? i++ का परिणाम i का वर्तमान मान (प्रतिलिपि) है, और i बाद में बढ़ाया गया है (पोस्ट)। तो आप एक बार फिर i++ के परिणाम में वृद्धि की कल्पना कैसे करते हैं? यदि i मूल रूप से 1 था, तो इसका मूल्य i++++ के बाद क्या होना चाहिए, और इस ऑपरेशन का नतीजा क्या होना चाहिए?

यदि आप इसके बारे में सोचते हैं, तो आपको शायद यह पता चलेगा कि यह बहुत इसे ठीक से परिभाषित करना मुश्किल होगा। चूंकि जावा के डिजाइनर सी/सी ++ "अपरिभाषित" जाल से बचने के इरादे से हैं (और चूंकि इस तरह के कथन का मूल्य सबसे अच्छा है), तो संभवतः उन्होंने इसे स्पष्ट रूप से अस्वीकार करने का निर्णय लिया।

unexpected type 
required: variable 
found : value 
     (i++)++; 

तो, मैं ++ एक मूल्य का आकलन करती है, जबकि ऑपरेटर एक चर की आवश्यकता है:

+0

नहीं, ऐसा नहीं है। जैसा कि अन्य उत्तरों में बताया गया है, कारण है कि अभिव्यक्ति i ++ का परिणाम एक मान है, संदर्भ नहीं है जिसे बदला जा सकता है। –

+0

@ जॉन, तो फिर आपके प्रश्न का क्या मतलब था? –

+0

मुझे याद आया कि टिप्पणियों/उत्तरों के कारण। –

8

त्रुटि आप इस सवाल का जवाब बताता है।

+2

एचएम, मुझे लगता है कि संकलक पर निर्भर करता है। EclipseC उपज »संचालन के लिए अवैध तर्क ++/-« जो सहायक नहीं है। – Joey

+0

दिलचस्प। हाँ, यह लगभग सहायक नहीं है। उपरोक्त त्रुटि सूर्य संकलक से है। – JOTN

5

आप केवल एक अभिव्यक्ति के लिए ++ या -- लागू कर सकते हैं जो एक संशोधित स्थान (एक lvalue) को दर्शाता है। ++ या -- का परिणाम स्थान (एक रैल्यू - या तो वृद्धि या कमी के पहले या बाद में) का मूल्य है, और स्वयं एक संशोधित स्थान नहीं है।तो आप (a++)++ नहीं कह सकते हैं कि आप (a+b)++ कह सकते हैं - संशोधित करने के लिए कोई स्थान नहीं है।

0

i ++ में, ++ एक पोस्टफिक्स ऑपरेटर है, इसलिए यह मेरा मान देता है और फिर इसे बढ़ाता है। आप क्या चाहते हैं (i ++) ++ करना है? क्या मुझे i + 1 वापस करना चाहिए (i ++ == i)? !

i++ == i; // true 
j = i++ // j gets the value of i 
j++ == i // still true since j== i 

(i++) ++ == j ++ // what should be the answer here? 

आप i + = 2 पर विचार किया है: यदि नहीं कि अजीब है कि मैं ++ = मैं लेकिन (i ++) ++ = i) निम्नलिखित भाव पर विचार नहीं हो सकता है?

2

मैं ++ मूल रूप से के लिए एक शॉर्टकट है:

(i = मैं + 1)

और यह कोई मतलब नहीं होगा लिखने के लिए:

(i = i + 1) ++ ;

सही? :)

+3

'(i = i + 1)' (i ++) 'जैसा ही व्यवहार नहीं है - पूर्व में मेरा नया मान देता है, बाद वाला पुराना रिटर्न देता है। –

+0

क्षमा करें। मुझे लगता है कि मैंने एक अच्छा स्माइली नहीं चुना जो कल्पनाशीलता व्यक्त करता है। मेरी गलती। -1 इसके लिए खुद के लिए। – Kylar

0

आप शॉर्टेंड वृद्धि ऑपरेटर का उपयोग क्यों नहीं करते?

i+=2 

वहां।

4

इस अभिव्यक्ति के साथ समस्या i = (i ++) ++; यह है कि (i ++) को मान पर हल किया जाता है और ++ ऑपरेटर की परिभाषा का कहना है कि 1। यह निर्दिष्ट वैरिएबल को बढ़ाएगा और इसके लिए एक मान डाल देगा/करेगा यदि आप पोस्टफिक्स या उपसर्ग का उपयोग करते हैं। 2. इस ऑपरेटर को चर या प्रत्यय की आवश्यकता होती है या नहीं। लेकिन यहां क्या हो रहा है (i ++) एक मान वापस कर रहा है और इसे (i ++) के स्थान पर रख रहा है और फिर आपके पास (मान) ++ और (मान) इस ऑपरेटर के लिए अपेक्षित प्रकार नहीं है क्योंकि इसकी आवश्यकता है मूल्य के स्थान पर एक चर।

जावा में उदाहरण के लिए यदि आप निम्नलिखित कोड संकलन स्निपेट को त्रुटि प्राप्त होगी के रूप में स्निपेट के बाद दिखाया गया है:

सार्वजनिक वर्ग एक { सार्वजनिक शून्य परीक्षण() { पूर्णांक मैं = 0; i = (i ++) ++; } }

संकलन उत्पादन:

एजावा: 4: अप्रत्याशित प्रकार आवश्यक: परिवर्तनीय मिला: मूल्य i = (i ++) ++; ^ 1 त्रुटि

1

याद रखना चाहिए: वृद्धि & घटती (उपसर्ग & पोस्टफ़िक्स) ऑपरेटर हमेशा चर नहीं मूल्य के साथ काम

यहाँ मैं हूँ एक exe के साथ यह समझाने :

int i = 0; 

int j = (i++)++; 

exe ​​से ऊपर।

initialize value of i with 0(zero)

in (i++) '++' work with i which is variable & after performing operation return (1)

now in (1)++ '++' work with (1) which is value not variable that is oppose to rules of java that's why compile time error generate Invalid argument to operation ++/--

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