c++ - सी++ प्रोग्राम्स




तो मैं=++ i+1 सी++ 11 में अच्छी तरह परिभाषित क्यों है? (2)

मैंने other समान questions देखा है और इसके बारे में defect पढ़ा है। लेकिन मुझे अभी भी यह नहीं मिला है। i = ++i + 1 सी ++ 11 में अच्छी तरह परिभाषित क्यों i = ++i + 1 जब i = i++ + 1 नहीं है? मानक यह कैसे परिभाषित करता है?

मेरे कामकाज से, मेरे पास ग्राफ से पहले अनुक्रमित है (जहां एक तीर रिश्ते से पहले अनुक्रमित करता है और सब कुछ एक मूल्य गणना है जब तक अन्यथा निर्दिष्ट नहीं किया जाता है):

i = ++i + 1
     ^
     |
assignment (side effect on i)
 ^      ^
 |      |
☆i   ++i + 1
     ||    ^
    i+=1   |
     ^     1
     |
★assignment (side effect on i)
  ^      ^
  |      |
  i      1

मैंने एक काले सितारा के साथ एक साइड इफेक्ट चिह्नित किया है और एक सफेद सितारा के साथ मूल्य गणना। ये एक-दूसरे के संबंध में अपरिचित प्रतीत होते हैं (मेरे तर्क के अनुसार)। और मानक कहता है:

यदि स्केलर ऑब्जेक्ट पर साइड इफेक्ट एक ही स्केलर ऑब्जेक्ट या किसी अन्य स्केलर ऑब्जेक्ट के मान का उपयोग करके मूल्य गणना पर किसी अन्य दुष्प्रभाव के सापेक्ष अपरिचित है, तो व्यवहार अपरिभाषित है।

defect में स्पष्टीकरण ने मुझे समझने में मदद नहीं की। लालसा-से-रावल्यू रूपांतरण को कुछ भी करने के साथ क्या करना है? मुझे क्या गलत मिला है?


... या एक ही स्केलर ऑब्जेक्ट के मान का उपयोग कर मूल्य गणना ...

महत्वपूर्ण हिस्सा यहां बोल्ड किया गया है। बाएं हाथ की तरफ मूल्य गणना के लिए i मान का उपयोग नहीं करता है। गणना की जा रही है एक glvalue है । केवल बाद में (अनुक्रमित), ऑब्जेक्ट का मान स्पर्श और प्रतिस्थापित किया जाता है।

दुर्भाग्य से यह एक बहुत सूक्ष्म बिंदु है :)


इस सवाल पूछने के बाद से, मैंने ग्राफ के साथ सी ++ मूल्यांकन अनुक्रमण को देखने पर एक लेख लिखा है। यह प्रश्न i = ++i के मामले के समान है, जिसमें निम्न अनुक्रमित ग्राफ से पहले है:

लाल नोड्स i पर साइड इफेक्ट्स का प्रतिनिधित्व करते हैं। नीला नोड एक मूल्यांकन का प्रतिनिधित्व करता है जो i के मान का उपयोग करता है । इस अभिव्यक्ति को अच्छी तरह से परिभाषित करने का कारण यह है कि इनमें से कोई भी नोड्स एक-दूसरे के साथ नहीं हैं। अभिसरण के बाईं ओर i का उपयोग i के मान का उपयोग नहीं करता है, इसलिए कोई समस्या नहीं है।

मुख्य भाग जिसे मैं याद कर रहा था वह "मूल्य का उपयोग" का अर्थ था। एक ऑपरेटर अपने ऑपरेंड के मूल्य का उपयोग करता है अगर वह उस ऑपरेंड के लिए एक प्रचलित अभिव्यक्ति की अपेक्षा करता है। किसी ऑब्जेक्ट का नाम देते समय, जो एक लवल्यू है, लेवल्यू को लैवल्यू-टू-रावल्यू रूपांतरण से गुज़रना पड़ता है, जिसे "ऑब्जेक्ट के मूल्य को पढ़ने" के रूप में देखा जा सकता है। असाइनमेंट को केवल बाएं ऑपरेंड के लिए एक लाभा की आवश्यकता होती है, जिसका अर्थ है कि यह इसके मूल्य का उपयोग नहीं करता है।





language-lawyer