2014-11-19 3 views
6

शीर्षक क्या कहता है। सी ++ के लिए, (++a)++ संकलित करता है। अजीब पर्याप्त है, हालांकि, ++(a++) नहीं करता है:सी ++ में '++ ए ++' संकलित क्यों नहीं है लेकिन `(++ ए) ++` करता है?

int main() { 
    int a = 0; 
    ++a++; // does not compile 
    (++a)++; // does compile 
    ++(a++); // does not compile 
} 

लेकिन जावा में, यह सब तीन के लिए नहीं करता है:

public class Test { 
    public static void main(String[] args) { 
     int a = 0; 
     ++a++; // does not compile 
     (++a)++; // does not compile 
     ++(a++); // does not compile 
    } 
} 

वहाँ किसी भी कारण है कि सी ++ जावा में इस बल्कि संकलित है? उदाहरण के

+0

क्या सी ++ संकलक? और आपको लगता है कि 'ए ++' एक 'शून्य' कथन है? –

+0

@FredLarson मैंने ideone.com पर 'C++ 11' कंपाइलर का उपयोग किया, लेकिन मुझे लगता है कि यह किसी भी C++ कंपाइलर पर स्वीकार्य है। मुझे लगता है कि यह एक 'शून्य' कथन है क्योंकि यह बराबर (कार्यात्मक रूप से) है: 'ए = ए + 1; 'जो वास्तविक मूल्य नहीं देता है। – Ryan

+0

'" ...एक पार्सर केवल एक-टोकन लुकहेड का उपयोग करके और पार्स के दौरान कोई अर्थपूर्ण विश्लेषण नहीं बता पाएगा, जब ++ लुकहेड टोकन है, चाहे (पी) को प्राथमिक अभिव्यक्ति माना जाना चाहिए या बाद में विचार के लिए अकेले छोड़ दिया जाना चाहिए CastExpression। "' – azurefrog

उत्तर

11

कोई भी जावा में काम करते हैं, क्योंकि दोनों पोस्टफ़िक्स और उपसर्ग वेतन वृद्धि के संचालन मूल्यों नहीं चर लौट हम एक उदाहरण के लिए Postfix Increment Operator ++ पर JLS अनुभाग पर जाकर देख सकते हैं और यह कहते हैं:

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

Prefix Increment Operator ++ के लिए जेएलएस अनुभाग एक ही बात कहता है।

2++ ; 
++3 ; 

जो निम्न त्रुटि देता है::

required: variable 
found: value 

कौन सा एक ही गलती हम आपके उदाहरण के लिए प्राप्त है

यह एक शाब्दिक मूल्य (see it live) बढ़ाने के लिए कोशिश की तरह होगा ।

सी ++ उपसर्ग वृद्धि में एक अंतराल लौटाता है लेकिन पोस्टफिक्स वृद्धि एक प्रावधान देता है और सी ++ में दोनों उपसर्ग और पोस्टफिक्स वृद्धि में एक अंतराल की आवश्यकता होती है। तो अपने पहले और तीसरे सी ++ उदाहरण:

++a++; 
++(a++) 

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

(++a)++; 

ठीक है क्योंकि उपसर्ग वृद्धि एक अंतराल देता है।

संदर्भ के लिए खंड में draft C++ standard5.2पोस्टफिक्स भाव का कहना है:

The value of a postfix ++ expression is the value of its operand [...] The operand shall be a modifiable lvalue

और:

The result is a prvalue

और अनुभाग 5.3एकल भाव का कहना है:

The operand of prefix ++ is modified [...] The operand shall be a modifiable lvalue

और:

The result is the updated operand; it is an lvalue

+0

शानदार जवाब, धन्यवाद। – Ryan

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