2010-08-26 14 views
24

अनिवार्य प्रोग्रामिंग में एक अनुक्रम बिंदु कंप्यूटर प्रोग्राम के निष्पादन में किसी भी बिंदु को परिभाषित करता है जिस पर यह गारंटी दी जाती है कि पिछले मूल्यांकन के सभी दुष्प्रभावों का प्रदर्शन किया जाएगा, और बाद के मूल्यांकन से कोई साइड इफेक्ट अभी तक नहीं हुआ है प्रदर्शन किया।अनुक्रम बिंदु सी

इसका क्या अर्थ है? क्या कोई इसे सरल शब्दों में समझा सकता है?

+0

[अनुक्रम बिंदु और आंशिक क्रम] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/1895922/sequence-points-and-partial-order) – jev

उत्तर

36

जब कोई अनुक्रम बिंदु होता है, तो मूल रूप से इसका मतलब है कि आपको गारंटी है कि सभी पिछले ऑपरेशन पूर्ण हो गए हैं।

एक अंतरण अनुक्रम बिंदु के बिना दो बार एक चर बदलना अपरिभाषित व्यवहार का एक उदाहरण है।

उदाहरण के लिए, i = i++; अपरिभाषित है क्योंकि i में दो परिवर्तनों के बीच कोई अनुक्रम बिंदु नहीं है।

सी और सी ++ मानकों में विकिपीडिया में list of the sequence points है हालांकि निश्चित सूची हमेशा आईएसओ मानक से ली जानी चाहिए। C99 परिशिष्ट सी से:, के बाद तर्क मूल्यांकन किया गया है (6.5.2.2)

  • कॉल एक समारोह के लिए:


    निम्न क्रम अंक 5.1.2.3 में वर्णित हैं।

  • निम्न ऑपरेटरों के पहले ऑपरेंड का अंत: तार्किक और & & (6.5.13); तार्किक या || (6.5.14); सशर्त? (6.5.15); अल्पविराम, (6.5.17)।
  • पूर्ण घोषणाकर्ता का अंत: घोषणाकर्ता (6.7.5);
  • पूर्ण अभिव्यक्ति का अंत: प्रारंभकर्ता (6.7.8); एक अभिव्यक्ति में अभिव्यक्ति कथन (6.8.3); एक चयन कथन की नियंत्रण अभिव्यक्ति (यदि या स्विच) (6.8.4); थोड़ी देर की नियंत्रण अभिव्यक्ति या कथन (6.8.5); प्रत्येक बयान के लिए अभिव्यक्तियों में से प्रत्येक (6.8.5.3); रिटर्न स्टेटमेंट (6.8.6.4) में अभिव्यक्ति।
  • लाइब्रेरी फ़ंक्शन लौटने से तुरंत (7.1.4)।
  • प्रत्येक स्वरूपित इनपुट/आउटपुट फ़ंक्शन रूपांतरण विनिर्देशक (7.1 9.6, 7.24.2) से जुड़े कार्यों के बाद।
  • तुलनात्मक कार्य करने के लिए प्रत्येक कॉल के तुरंत बाद और तुरंत, और किसी भी कॉल के तुलनात्मक तुलना में किसी भी कॉल के बीच और ऑब्जेक्ट्स के किसी भी आंदोलन के बीच उस कॉल के तर्क (7.20.5) के रूप में पारित किया गया।

C11 शब्दों को बदल दिया है।

    समारोह डेसिग्नेटर का मूल्यांकन और वास्तविक बहस के बीच
  • :


    निम्न क्रम अंक 5.1.2.3 में वर्णित हैं: यह त्रिगुट ऑपरेटर बाहर टूट और कुछ और अधिक विस्तार को शामिल किया है प्रतीत होता है एक समारोह में कॉल और वास्तविक कॉल। (6.5.2.2)।

  • निम्नलिखित ऑपरेटरों के पहले और दूसरे ऑपरेटरों के मूल्यांकन के बीच: तार्किक और & & (6.5.13); तार्किक या || (6.5.14); अल्पविराम, (6.5.17)।
  • सशर्त के पहले ऑपरेंड के मूल्यांकन के बीच?: ऑपरेटर और जो भी दूसरे और तीसरे ऑपरेटरों का मूल्यांकन किया जाता है (6.5.15)।
  • पूर्ण घोषणाकर्ता का अंत: घोषणाकर्ता (6.7.6);
  • पूर्ण अभिव्यक्ति के मूल्यांकन और अगली पूर्ण अभिव्यक्ति के बीच मूल्यांकन किया गया। निम्नलिखित पूर्ण अभिव्यक्तियां हैं: प्रारंभकर्ता (6.7.9); में अभिव्यक्ति कथन (6.8.3) में अभिव्यक्ति; चयन विवरण (यदि या स्विच) की नियंत्रण अभिव्यक्ति (6.8.4); थोड़ी देर की नियंत्रण अभिव्यक्ति या कथन (6.8.5); एक बयान के अभिव्यक्तियों में से प्रत्येक (6.8.5.3); रिटर्न स्टेटमेंट में अभिव्यक्ति (6.8.6.4)।
  • लाइब्रेरी फ़ंक्शन लौटने से तुरंत (7.1.4)।
  • प्रत्येक स्वरूपित इनपुट/आउटपुट फ़ंक्शन रूपांतरण विनिर्देशक (7.21.6, 7.28.2) से जुड़े कार्यों के बाद।
  • तुरंत पहले और तुरंत एक तुलना समारोह के लिए किसी भी कॉल और वस्तुओं कि कॉल (7.22.5) के लिए तर्क के रूप में पारित के किसी भी आंदोलन के बीच भी एक तुलना कार्य करने के लिए प्रत्येक कॉल, और बाद।
+0

मैं आपको पैक्स से अधिक जानकारी की उम्मीद कर रहा हूं। मेरे पास बुनियादी ज्ञान है सी में। आपने मेरे पिछले प्रश्न के लिए बहुत अच्छी व्याख्या दी है। – Jagan

+1

वाह, 100k प्रतिनिधि! बधाई। – dreamlax

+1

यह एक वैरिएबल के मान को संशोधित करने के लिए अपरिभाषित व्यवहार भी है और बिना किसी अनुक्रमित अनुक्रम बिंदु के संग्रहीत मूल्य को निर्धारित करने के अलावा किसी अन्य तरीके से मूल्य का उपयोग भी करता है। उदाहरण के लिए, एक [i ++] = i अपरिभाषित है क्योंकि, हालांकि यह केवल एक बार मेरे मान को संशोधित करता है, लेकिन मेरे मान का उपयोग यह निर्धारित करने के अलावा किसी अन्य उद्देश्य के लिए किया जाता है कि मैं किस स्टोर में स्टोर करना चाहता हूं। –

1

इसका मतलब है कि एक कंपाइलर फंकी अनुकूलन, चाल और जादू कर सकता है लेकिन इन तथाकथित अनुक्रम बिंदुओं पर एक अच्छी तरह से परिभाषित राज्य तक पहुंच जाना चाहिए।

3

उदाहरण के साथ पैक्सडीब्लो के जवाब पर विस्तार करना।

बयान मान लें

x = i++ * ++j; 

तीन साइड इफेक्ट होते हैं: एक्स को i * (j+1) का परिणाम बताए, मैं करने के लिए 1 जोड़ने, और जे के लिए 1 जोड़ने। जिस क्रम में दुष्प्रभाव लागू होते हैं वह अनिर्दिष्ट है; i और j प्रत्येक को मूल्यांकन के तुरंत बाद बढ़ाया जा सकता है, या दोनों का मूल्यांकन तब तक नहीं किया जा सकता जब तक कि दोनों का मूल्यांकन नहीं किया जाता है लेकिन एक्स को असाइन किए जाने से पहले, या x को असाइन किए जाने तक उन्हें बढ़ाया नहीं जा सकता है।

अनुक्रम बिंदु वह बिंदु है जहां सभी दुष्प्रभाव लागू किए गए हैं (x, i, और j सभी को अपडेट किया गया है), चाहे वे किस क्रम में लागू किए गए थे।

+5

हालांकि, हमें यह इंगित करना चाहिए कि 'x = i ++ * ++ j' का परिणाम अच्छी तरह से परिभाषित है, paxdiablo के' i = i ++ 'उदाहरण के विपरीत ... –

7

अनुक्रम बिंदुओं के बारे में ध्यान देने योग्य एक महत्वपूर्ण बात यह है कि वे वैश्विक नहीं हैं, बल्कि स्थानीय बाधाओं के सेट के रूप में माना जाना चाहिए। उदाहरण के लिए, बयान

 
a = f1(x++) + f2(y++); 

में वहाँ एक्स के मूल्यांकन ++ और f1 करने के लिए कॉल, और y के मूल्यांकन ++ और f2 करने के लिए कॉल के बीच एक और अनुक्रम बिंदु के बीच एक दृश्य है। हालांकि, इस बात की कोई गारंटी नहीं है कि x को पहले या बाद में एफ 2 कहा जाता है या नहीं, और न ही x को पहले या बाद में बढ़ाया जाएगा या नहीं। यदि एफ 1 वाई या एफ 2 में परिवर्तन बदलता है, तो परिणाम अपरिभाषित होंगे (यह कंपाइलर के जेनरेट कोड के लिए वैध होगा जैसे कि x और y, increment x, कॉल f1, पूर्व-पढ़ने वाले मान के विरुद्ध वाई जांचें, और - यदि यह बदल गया - सभी बार्नी वीडियो और व्यापार को खोजने और नष्ट करने के लिए एक क्रोध पर जाएं; मुझे नहीं लगता कि कोई असली कंपाइलर्स कोड उत्पन्न करता है जो वास्तव में ऐसा करता है, हां, लेकिन इसे मानक के तहत अनुमति दी जाएगी)।

+0

यदि कोई फ़ंक्शन x या y संशोधित करता है तो यह किया जाता है अनुक्रम बिंदु (फ़ंक्शन की वास्तविक कॉल से तुरंत एक)। व्यवहार अनिर्दिष्ट है। – 2501

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