अनुक्रम बिंदु

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

C11 (C मानक संशोधन) और C++11 के साथ, अनुक्रम बिंदु शब्द के उपयोग को अनुक्रमण द्वारा प्रतिस्थापित किया गया है। तीन संभावनाएं हैं:
 * 1) एक अभिव्यक्ति का मूल्यांकन किसी अन्य अभिव्यक्ति से पहले अनुक्रमित किया जा सकता है, या समकक्ष अन्य अभिव्यक्ति का मूल्यांकन पहले के बाद अनुक्रमित किया जाता है।
 * 2) अभिव्यक्तियों का मूल्यांकन अनिश्चित रूप से अनुक्रमित है, जिसका अर्थ है कि एक दूसरे से पहले अनुक्रमित है, लेकिन जो अनिर्दिष्ट है।
 * 3) अभिव्यक्तियों का मूल्यांकन अनुक्रमित है।

यदि वे राज्य (कंप्यूटर विज्ञान) साझा करते हैं, तो अप्रतिबंधित मूल्यांकन का निष्पादन ओवरलैप हो सकता है, जिससे संभावित विनाशकारी अपरिभाषित व्यवहार हो सकता है। यह स्थिति समानांतर संगणनाओं में उत्पन्न हो सकती है, जिससे दौड़ की स्थिति पैदा हो सकती है, लेकिन अपरिभाषित व्यवहार का परिणाम एकल-थ्रेडेड स्थितियों में भी हो सकता है। उदाहरण के लिए,  (कहाँ a एक सरणी है और i एक पूर्णांक है) में अपरिभाषित व्यवहार है।

अस्पष्टता के उदाहरण
दो सबरूटीन्स पर विचार करें  और. सी और सी ++ में,  ऑपरेटर अनुक्रम बिंदु से जुड़ा नहीं है, और इसलिए अभिव्यक्ति (कंप्यूटर विज्ञान) में   यह भी संभव है   या   पहले क्रियान्वित किया जाएगा। अल्पविराम ऑपरेटर अनुक्रम बिंदु प्रस्तुत करता है, और इसलिए कोड में   मूल्यांकन के क्रम को परिभाषित किया गया है: प्रथम   कहा जाता है, और फिर   कहा जाता है।

अनुक्रम बिंदु भी खेल में आते हैं जब एक ही चर को एक ही अभिव्यक्ति के भीतर एक से अधिक बार संशोधित किया जाता है। एक अक्सर उद्धृत उदाहरण सी (प्रोग्रामिंग भाषा) अभिव्यक्ति है, जो स्पष्ट रूप से दोनों असाइन करता है   इसका पिछला मूल्य और वृद्धि. का अंतिम मूल्य  अस्पष्ट है, क्योंकि, अभिव्यक्ति मूल्यांकन के क्रम के आधार पर, वेतन वृद्धि असाइनमेंट से पहले, बाद में या इंटरलीव्ड हो सकती है। किसी विशेष भाषा की परिभाषा संभावित व्यवहारों में से एक को निर्दिष्ट कर सकती है या केवल यह कह सकती है कि व्यवहार अपरिभाषित व्यवहार है। सी और सी ++ में, ऐसी अभिव्यक्ति का मूल्यांकन करने से अपरिभाषित व्यवहार उत्पन्न होता है। अन्य भाषाएं, जैसे सी शार्प (प्रोग्रामिंग लैंग्वेज) | सी #, असाइनमेंट और इंक्रीमेंट ऑपरेटर के संचालन के क्रम को इस तरह से परिभाषित करती हैं कि अभिव्यक्ति का परिणाम   यह गारंटीशुदा है।

सी ++ 03
तक

सी में और सी ++, अनुक्रम बिंदु निम्न स्थानों पर होते हैं। (सी ++ में, ऑपरेटर ओवरलोडिंग कार्य कार्यों की तरह कार्य करता है, और इस प्रकार ऑपरेटरों को ओवरलोड किया गया है जो फ़ंक्शन कॉल के समान ही अनुक्रम बिंदु पेश करते हैं।)


 * 1) बाएँ और दाएँ ऑपरेंड के मूल्यांकन के बीच   (तार्किक संयोजन),   (तार्किक संयोजन) (शॉर्ट सर्किट मूल्यांकन के हिस्से के रूप में), और अल्पविराम ऑपरेटर। उदाहरण के लिए, अभिव्यक्ति में *p++ != 0 && *q++ != 0, उप-अभिव्यक्ति के सभी दुष्प्रभाव *p++ != 0 एक्सेस करने के किसी भी प्रयास से पहले पूर्ण हो जाते हैं q.
 * 2) टर्नरी सशर्त ऑपरेटर के पहले ऑपरेंड और उसके दूसरे या तीसरे ऑपरेंड के मूल्यांकन के बीच। उदाहरण के लिए, अभिव्यक्ति में a = (*p++) ? (*p++) : 0 पहले के बाद एक अनुक्रम बिंदु है *p++, जिसका अर्थ है कि यह पहले से ही दूसरे उदाहरण के निष्पादित होने तक बढ़ा दिया गया है।
 * 3) एक पूर्ण अभिव्यक्ति के अंत में। इस श्रेणी में एक्सप्रेशन स्टेटमेंट शामिल हैं (जैसे कि असाइनमेंट a=b;), वापसी कथन ्स, के कंट्रोलिंग एक्सप्रेशंस if, switch, while, या do-while कथन, और तीनों भावों में से प्रत्येक   कथन।
 * 4) फ़ंक्शन कॉल में फ़ंक्शन दर्ज करने से पहले। जिस क्रम में तर्कों का मूल्यांकन किया जाता है वह निर्दिष्ट नहीं है, लेकिन इस अनुक्रम बिंदु का अर्थ है कि फ़ंक्शन दर्ज करने से पहले उनके सभी दुष्प्रभाव पूरे हो गए हैं। अभिव्यक्ति में f(i++) + g(j++) + h(k++), f के मूल मान के एक पैरामीटर के साथ कहा जाता है i, लेकिन i के शरीर में प्रवेश करने से पहले वृद्धि की जाती है f. इसी प्रकार, j और k प्रवेश करने से पहले अपडेट किए जाते हैं g और h क्रमश। हालांकि, यह किस क्रम में निर्दिष्ट नहीं है f, g, h निष्पादित किया जाता है, न ही किस क्रम में i, j, k बढ़ाए जाते हैं। यदि का शरीर f चरों तक पहुँचता है j और k, यह दोनों को पा सकता है, न तो, या उनमें से केवल एक को बढ़ा दिया गया है। (फ़ंक्शन कॉल f(a,b,c) कॉमा ऑपरेटर का उपयोग नहीं है; के लिए मूल्यांकन का क्रम a, b, और c अनिर्दिष्ट है।)
 * 5) फ़ंक्शन रिटर्न पर, रिटर्न वैल्यू को कॉलिंग संदर्भ में कॉपी करने के बाद। (यह अनुक्रम बिंदु केवल सी ++ मानक में निर्दिष्ट है; यह केवल सी में निहित रूप से मौजूद है। )
 * 6) प्रारंभकर्ता के अंत में#C भाषाओं का परिवार; उदाहरण के लिए, के मूल्यांकन के बाद 5 घोषणा में int a = 5;.
 * 7) प्रत्येक घोषणाकर्ता अनुक्रम में प्रत्येक घोषणाकर्ता के बीच; उदाहरण के लिए, के दो मूल्यांकनों के बीच a++ में int x = a++, y = a++. (यह कॉमा ऑपरेटर का उदाहरण नहीं है।)
 * 8) इनपुट/आउटपुट फॉर्मेट स्पेसिफायर से जुड़े प्रत्येक रूपांतरण के बाद। उदाहरण के लिए, अभिव्यक्ति में printf("foo %n %d", &a, 42), के बाद एक अनुक्रम बिंदु है %n का मूल्यांकन और छपाई से पहले किया जाता है 42.

C11 और C++11
आंशिक रूप से थ्रेड्स के लिए भाषा समर्थन की शुरुआत के कारण, C11 और C++11 ने मूल्यांकन क्रम के लिए नई शब्दावली पेश की। एक ऑपरेशन को दूसरे से पहले अनुक्रमित किया जा सकता है, या दोनों को अनिश्चित रूप से अनुक्रमित किया जा सकता है (एक को दूसरे से पहले पूरा करना होगा) या बिना अनुक्रमित (प्रत्येक अभिव्यक्ति में संचालन को इंटरलीव किया जा सकता है)।

सी ++ 17
C++17 ने मूल्यांकन आदेश के कई पहलुओं को प्रतिबंधित किया। {{code|new}ew}} अभिव्यक्ति हमेशा निर्माता तर्कों का मूल्यांकन करने से पहले स्मृति आवंटन करेगी। संचालक <<, >>, ., .*, ->*, और सबस्क्रिप्ट और फ़ंक्शन कॉल ऑपरेटर को बाएं से दाएं मूल्यांकन करने की गारंटी है (चाहे वे अतिभारित हों या नहीं)। उदाहरण के लिए, कोड

नए कॉल करने की गारंटी है a, b और c उस क्रम में। किसी भी असाइनमेंट-जैसे ऑपरेटर के बाईं ओर का मूल्यांकन दाईं ओर से पहले किया जाता है, ताकि  मूल्यांकन करने का आश्वासन दिया है a पहला। अंत में, हालांकि जिस क्रम में फ़ंक्शन पैरामीटर का मूल्यांकन किया जाता है वह कार्यान्वयन-परिभाषित रहता है, संकलक को अब कई पैरामीटर में उप-अभिव्यक्तियों को इंटरलीव करने की अनुमति नहीं है।

बाहरी संबंध

 * Question 3.8 of the FAQ for comp.lang.c