2010-05-06 10 views
6

नीचे दिखाए गए अनुसार वैध और अमान्य कैसे हैं और उनका क्या अर्थ है। कोड की इस टुकड़े को लिखने के लिए ऐसी स्थिति कब उत्पन्न होगी।वृद्धि और कमीशन ऑपरेटर

++x = 5;  // legal 
--x = 5;  // legal 
x++ = 5;  // illegal 
x-- = 5;  // illegal 
+0

http://stackoverflow.com/questions/1860461/why-is-i-i-1-unspecified-behavior –

+1

होमवर्क के संभावित डुप्लिकेट: यह मान किसी भी साधारण फ़ंक्शन द्वारा दिया गया मान बदलने से अधिक नहीं समझ फेरबदल बनाता है? परीक्षा प्रश्न? –

+0

वास्तव में उनमें से दोनों नहीं। बस जानना उत्सुक है। – ckv

उत्तर

13

पोस्टफिक्स (x ++/x--) ऑपरेटर एक लेल्यू (एक मान जिसे आप असाइन कर सकते हैं) वापस नहीं करते हैं।

वे एक अस्थायी मूल्य जो परिवर्तन

मूल्य एक rvalue है से पहले चर के मूल्य की एक प्रति है लौटने के लिए, तो आप लिख सकते हैं:

y = x++ और एक्स

के पुराने मूल्य प्राप्त
+0

आपको उस कोड को जोड़ना चाहिए जैसे कि इसका कभी भी उपयोग नहीं किया जाना चाहिए। –

+2

@ ब्रूनो: क्यों नहीं? पोस्ट-वृद्धि ऑपरेटर के लिए यह पूरी बात है। –

7

वे सभी x के मूल्य को अनुक्रम बिंदुओं के बीच एक से अधिक बार संशोधित करते हैं, और इसलिए अपरिभाषित व्यवहार हैं, जिन्हें आपको सावधानीपूर्वक टालना चाहिए। मुझे नहीं लगता कि "कानूनी" और "अवैध" के बीच भेद कहां से आता है - क्योंकि व्यवहार कानूनी है, किसी भी व्यवहार (राज्य के सचिव को मिश्रित ईमेल भेजने सहित) मानक के अनुसार पूरी तरह से है।

5

यह मानते हुए कि प्रश्न ++ और -- ऑपरेटरों के बारे में है, इनमें से कोई भी कथन सख्ती से कानूनी नहीं है।

पहले दो हैं अच्छी तरह से गठित है, अर्थात वे केवल compilable क्योंकि उपसर्ग वेतन वृद्धि का परिणाम lvalue है। पिछले दो खराब गठित हैं, क्योंकि पोस्टफिक्स वृद्धि के परिणाम एक रैल्यू नहीं है, यही कारण है कि आप इसे असाइन नहीं कर सकते हैं।

हालांकि, पहले दो भी इस अर्थ में कानूनी नहीं हैं कि वे अपरिभाषित व्यवहार उत्पन्न करते हैं। हस्तक्षेप अनुक्रम बिंदु के बिना एक ही वस्तु को एक से अधिक बार संशोधित करना अवैध है। (ध्यान दें, कि कंपाइलरों को अच्छी तरह से गठित कोड को संकलित करने से इनकार करने की अनुमति है जो अपरिभाषित व्यवहार उत्पन्न करता है, जिसका अर्थ है कि पहली जोड़ी भी गैर-संगत साबित हो सकती है)।

9

यह देखते हुए कि ऑपरेटर =() और ऑपरेटर ++() दोनों को अधिभारित किया जा सकता है, यह कहना असंभव है कि कोड ऑपरेटरों को किस प्रकार लागू किया जा रहा है, इस बारे में अधिक जानकारी के बिना कोड क्या करता है।

+1

यह क्यों उत्सुक था कि यह क्यों कम किया गया था - आदमी का एक वैध बिंदु है। मुझे उम्मीद है कि ओपी इनट्स में काम कर रहा है, लेकिन इसका कोई उल्लेख नहीं है। – Puppy

+0

मेरा मानना ​​है कि यह भी संभव है कि एक्स नॉन-स्केलर प्रकार है तो इसका अपरिभाषित व्यवहार न हो। –

+0

@DeadMG: जब लोग उनके बारे में नहीं सोचते थे या सोचते थे कि वे भी "फैंसी" या "पैडेंटिक" हैं, तो लोग चीजों को कम करते हैं। –

1

स्पष्ट रूप से, आपको इसे कभी नहीं लिखना चाहिए। Postincrement और पूर्व वृद्धि (और कमी) केवल अपने आप पर इस्तेमाल किया जाना चाहिए। वे सिर्फ भ्रम के लिए व्यंजन हैं।

+2

यदि आप केवल उन्हें स्वयं ही उपयोग करते हैं, तो वृद्धि वृद्धि एक बेकार ऑपरेटर है। –

+0

मुझे लगता है कि जब डेडएमजी ने कहा "अपने आप पर" तो वह डबल असाइनमेंट नहीं करता था। वह 'if (x ++) {/*...*/} 'आदि जैसी चीजों को बाहर करने का मतलब नहीं था, सही, मृत एमजी? –

+0

मैं बिल्कुल उनको बाहर करने का मतलब था। Postincrement और पूर्व वृद्धि वृद्धि सिंटेक्टिक चीनी हैं, वास्तव में एक अभिव्यक्ति में इस्तेमाल किया जब अच्छा नहीं है। यदि आपको इसकी जरुरत है, तो इसे मैन्युअल रूप से करें, कंपाइलर को इसे दूसरे रूप में बदल दें। लेकिन मुझे नहीं लगता कि आपको किस संभावित स्थिति की आवश्यकता हो सकती है। – Puppy

1

एकमात्र जगह जहां मैं सोच सकता हूं कि ऐसी स्थिति कहां होगी ऑपरेटर ++ और ऑपरेटर = के ऑपरेटर ओवरलोड के साथ। फिर भी, परिभाषा स्पष्ट नहीं है। आप जो कोड कह रहे हैं वह मूल रूप से एक में x जोड़ता है, फिर 5 को असाइन करें। एक सवाल उठता है जैसे कि आपको 5 को आवंटित करने से पहले एक्स को बढ़ाने की आवश्यकता क्यों होगी? एकमात्र संभावित स्पष्टीकरण यह है कि यदि आपके पास कुछ प्रकार की कक्षा है जहां ++ ऑपरेटर किसी भी तरह से एक आंतरिक काउंटर बढ़ाता है, तो असाइनमेंट। कोई विचार नहीं कि यद्यपि ऐसी चीज क्यों जरूरी है।

2

++x और --x दोनों आप वापस देना x (के बाद यह संख्या बढ़ गया है/कम कर)। उस बिंदु पर आप जो भी चाहते हैं वह कर सकते हैं, जिसमें इसे एक नया मान भी शामिल है।

x++ और x-- दोनों आप वापस देना क्या x था (बस पहले यह संख्या बढ़ गया था/कम कर)।

obj->getValue() += 3; // pointless 
संबंधित मुद्दे