2012-07-26 9 views
5

के लिए कई उपसर्ग नहीं बल्कि postfixes को स्वीकार करता है Can you have a incrementor and a decrementor on the same variable in the same statement in cक्यों सी ++ एक चर

में देख जबकि मुझे पता चला आप एक ही चर पर कई उपसर्ग वेतन वृद्धि/कमी ऑपरेटरों हो सकता है, लेकिन केवल एक पोस्टफ़िक्स

पूर्व:

++--++foo; // valid 
foo++--++; // invalid 
--foo++; // invalid 

यह क्यों है?

उत्तर

8

यह इस तथ्य के कारण है कि सी ++ (लेकिन सी नहीं) में, ++x का परिणाम एक एलवीएलयू है, जिसका अर्थ है कि यह असाइन करने योग्य है, और इस प्रकार श्रृंखला सक्षम है।

हालांकि, x++ का परिणाम एक lValue नहीं है, बल्कि यह एक prvalue है, जिसका अर्थ है कि इसे असाइन नहीं किया जा सकता है, और इस प्रकार इसे जंजीर नहीं किया जा सकता है।

+1

संबंधित: http://stackoverflow.com/a/3601661/706836 – Pyrodante

6

C++ भाषा उपसर्ग वेतन वृद्धि/कमी ऑपरेटरों, lvalues ​​ वापसी करते हुए पोस्टफ़िक्स लोगों rvalues ​​ लौट आते हैं। इस बीच, सभी संशोधित ऑपरेटरों को lvalue तर्क की आवश्यकता होती है। इसका अर्थ यह है कि उपसर्ग वृद्धि/कमी का परिणाम किसी अन्य अतिरिक्त ऑपरेटर को पास किया जा सकता है जिसके लिए एक अंतराल तर्क (अतिरिक्त वृद्धि/कमी सहित) की आवश्यकता होती है।

सी में बहुत इसी कारण ++ आप इस

int i = 0; 
int *p = &++i; 

जो i को बढ़ा देते और i करने के लिए p बिंदु कर देगा की तरह कोड लिख सकते हैं के लिए

। यूनरी & को लवल्यू ऑपरेंड की आवश्यकता है, यही कारण है कि यह उपसर्ग ++ (लेकिन पोस्टफिक्स के साथ नहीं) के परिणामस्वरूप काम करेगा। बिल्ट-इन उपसर्ग वेतन वृद्धि से अधिक के साथ

भाव/एक ही वस्तु के लिए आवेदन किया decrements अपरिभाषित व्यवहार उत्पादन, लेकिन वे फिर भी अच्छी तरह से बनते हैं (अर्थात "compilable")।

++foo-- जैसे अभिव्यक्तियां अमान्य हैं क्योंकि सी ++ पोस्टफिक्स ऑपरेटरों में उपसर्ग की तुलना में अधिक प्राथमिकता है। ब्रेसेस इसे बदल सकते हैं। उदाहरण के लिए, (++foo)-- एक अच्छी तरह से गठित अभिव्यक्ति है, यद्यपि फिर से अपरिभाषित व्यवहार की ओर अग्रसर है।

+0

क्या आप कुछ दस्तावेज दिखा सकते हैं जो कहता है कि परिणाम अपरिभाषित है? मुझे लगता है कि यह पूरी तरह से अच्छी तरह से परिभाषित किया जाना चाहिए (मूल्यांकन दाएं से बाएं बाहर)। –

+0

@ रिचर्ड जे। रौसीआईआई यूबी क्योंकि * (सी ++ 11, 1.9 पी 15) "यदि स्केलर ऑब्जेक्ट पर एक साइड इफेक्ट एक ही स्केलर ऑब्जेक्ट पर किसी अन्य दुष्प्रभाव या समान स्केलर ऑब्जेक्ट के मान का उपयोग करके मूल्य गणना के विपरीत नहीं है , व्यवहार अपरिभाषित है। "* – ouah

+0

@ रिचर्ड जे रॉस III: सी ++ भाषा विनिर्देश (सी ++ 98, सी ++ 03) में जाने-माने अनुच्छेद 5/4। * अनुक्रम बिंदु * (एसपी) हस्तक्षेप किए बिना दो बार एक ही वस्तु को संशोधित करने के लिए यह अवैध है (यूबी अर्थ में)। सी ++ एसपी के बिना अंतर्निहित ऑपरेटरों के मूल्यांकन के क्रम को परिभाषित नहीं करता है। एसपी के बिना सी ++ में "बाएं से दाएं का मूल्यांकन" जैसी कोई चीज नहीं है। किसी भी आदेश के लिए एसपी हस्तक्षेप की आवश्यकता है। '++ - foo' में कोई अनुक्रम बिंदु नहीं है, इसलिए व्यवहार अपरिभाषित है। सी ++ 11 अनुक्रमित करने के लिए एक अलग औपचारिक दृष्टिकोण का उपयोग करता है, लेकिन बुनियादी सिद्धांत वही रहता है। – AnT

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