संचालक साहचर्य

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

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

कई प्रोग्रामिंग भाषा मैनुअल ऑपरेटर प्राथमिकता और सहयोगीता की एक तालिका प्रदान करते हैं; उदाहरण के लिए, C और C++ के लिए तालिका देखें।

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

उदाहरण
साहचर्यता की आवश्यकता केवल तभी होती है जब किसी अभिव्यक्ति में संचालकों की प्राथमिकता समान हो। समान्यता:  और  की प्राथमिकता समान होती है। अभिव्यक्ति  .पर विचार करें। परिणाम या तो  या  .हो सकता है। पहला परिणाम उस स्थिति से मेल खाता है जब  और   बाएं-सहयोगी हैं, उत्तरार्द्ध जब   और   सही-सहयोगी होते हैं।

सामान्य उपयोग को प्रतिबिंबित करने के लिए, जोड़, घटाव, गुणा और भाग ऑपरेटर समान्यता: बाएं-सहयोगी होते हैं,   जबकि एक घातांक ऑपरेटर के लिए (यदि उपस्थित है) और नुथ के अप-एरो ऑपरेटरों के बीच कोई सामान्य सहमति नहीं है। कोई भी असाइनमेंट ऑपरेटर समान्यता: राइट-एसोसिएटिव होते हैं। ऐसे स्थिति को रोकने के लिए जहां ऑपरेंड दो ऑपरेटरों के साथ जुड़े होंगे, या किसी भी ऑपरेटर के लिए समान प्राथमिकता वाले सभी ऑपरेटरों की समान संबद्धता नहीं होनी चाहिए।

एक विस्तृत उदाहरण
अभिव्यक्ति, पर विचार करें, जिसमें को एक सही-सहयोगी घातांक ऑपरेटर के रूप में लिया गया है। टोकन को बाएँ से दाएँ पढ़ने वाला एक पार्सर,  की दाएँ-सहयोगिता के कारण, शाखा में साहचर्य नियम को निम्नलिखित विधि से प्रयुक्त करता है : इसके बाद इसका गहराई से मूल्यांकन किया जा सकता है, शीर्ष नोड (पहला ^) से प्रारंभ करते है: एक बाएं-साहचर्य मूल्यांकन के परिणामस्वरूप पार्स ट्री  और पूरी तरह से अलग परिणाम (625$2$)$9$ = 244,140,625$262144$ ≈ $6.206$. होता है।
 * 1) अवधि   पढ़ा जाता है।
 * 2) नॉनटर्मिनल   पढ़ा जाता है। नोड:.
 * 3) अवधि   पढ़ा जाता है। नोड:.
 * 4) नॉनटर्मिनल   पढ़ा जाता है, जिससे सही-साहचर्य नियम सक्रिय हो जाता है। सहयोगीता नोड तय करती है:.
 * 5) अवधि   पढ़ा जाता है। नोड:.
 * 6) नॉनटर्मिनल   पढ़ा जाता है, जिससे सही-साहचर्य नियम का पुन: अनुप्रयोग प्रारंभ हो जाता है। नोड.
 * 7) अवधि   पढ़ा जाता है। नोड.
 * 8) पढ़ने के लिए कोई टोकन नहीं. पार्स ट्री उत्पन्न करने के लिए साहचर्यता प्रयुक्त करें.
 * 1) मूल्यांकनकर्ता पेड़ के नीचे पहले से दूसरे से तीसरे  अभिव्यक्ति तक चलता है।
 * 2) इसका मूल्यांकन इस प्रकार है: 3$3$ = 9 परिणाम अभिव्यक्ति शाखा को दूसरे के दूसरे ऑपरेंड के रूप में प्रतिस्थापित करता है।
 * 3) मूल्यांकन पार्स ट्री से एक स्तर ऊपर इस प्रकार जारी है: : 4$2$ = 262,144.पुनः, परिणाम अभिव्यक्ति शाखा को पहले के दूसरे ऑपरेंड के रूप में प्रतिस्थापित करता है।
 * 4) फिर से, मूल्यांकनकर्ता पेड़ को मूल अभिव्यक्ति तक ले जाता है और इस प्रकार मूल्यांकन करता है: 5$2$ ≈ $5.96$. अंतिम शेष शाखा नष्ट हो जाती है और परिणाम समग्र परिणाम बन जाता है, जिससे समग्र मूल्यांकन पूरा हो जाता है।

असाइनमेंट ऑपरेटर की सही-सहयोगिता
कई अनिवार्य प्रोग्रामिंग भाषाओं में, असाइनमेंट ऑपरेटर को राइट-एसोसिएटिव के रूप में परिभाषित किया गया है, और असाइनमेंट को एक अभिव्यक्ति (जो एक मूल्य का मूल्यांकन करता है) के रूप में परिभाषित किया गया है, और न कि केवल एक कथन के रूप में यह एक असाइनमेंट एक्सप्रेशन के मान को अगले असाइनमेंट एक्सप्रेशन के सही ऑपरेंड के रूप में उपयोग करके असाइनमेंट (कंप्यूटर विज्ञान) या श्रृंखलाबद्ध असाइनमेंट की अनुमति देता है।

सी में, असाइनमेंट एक अभिव्यक्ति है जो उसी मूल्य का मूल्यांकन करती है जैसे अभिव्यक्ति   को   के प्रकार में परिवर्तित किया जाता है,   के आर-मान को  के एल-मान में संग्रहीत करने के साइड इफेक्ट के साथ   इसलिए अभिव्यक्ति  की व्याख्या   के रूप में की जा सकती है; वैकल्पिक अभिव्यक्ति   एक त्रुटि उत्पन्न करती है क्योंकि   एक एल-मान अभिव्यक्ति नहीं है, अथार्त इसमें आर-मान है किंतु एल-मान नहीं है जहां  के आर-मान को स्टोर करना है।   ऑपरेटर की सही-सहयोगिता  जैसी अभिव्यक्तियों को  के रूप में व्याख्या करने की अनुमति देती है।

C++ में, असाइनमेंट  एक अभिव्यक्ति है जो अभिव्यक्ति  के समान मान का मूल्यांकन करती है, जिसमें   के R-मान को. के L-मान में संग्रहीत करने का दुष्प्रभाव होता है। इसलिए अभिव्यक्ति  की व्याख्या अभी भी. के रूप में की जा सकती है; और वैकल्पिक अभिव्यक्ति की व्याख्या   के रूप में की जा सकती है;  एक त्रुटि उत्पन्न करने के अतिरिक्त   ऑपरेटर की सही-सहयोगिता   जैसी अभिव्यक्तियों को  के रूप में व्याख्या करने की अनुमति देती है।

गैर-सहयोगी ऑपरेटर
गैर-सहयोगी ऑपरेटर वे ऑपरेटर होते हैं जिनका किसी अभिव्यक्ति में अनुक्रम में उपयोग किए जाने पर कोई परिभाषित व्यवहार नहीं होता है। प्रोलॉग में इन्फ़िक्स ऑपरेटर :- गैर-सहयोगी है क्योंकि " जैसे निर्माण वाक्यविन्यास त्रुटियों का कारण बनते हैं।

एक और संभावना यह है कि कुछ ऑपरेटरों के अनुक्रमों की व्याख्या किसी अन्य विधि से की जाती है, जिसे साहचर्य के रूप में व्यक्त नहीं किया जा सकता है। इसका समान्यता: अर्थ यह है कि वाक्यात्मक रूप से, इन परिचालनों के अनुक्रम के लिए एक विशेष नियम है, और शब्दार्थिक रूप से व्यवहार अलग है। इसका एक अच्छा उदाहरण पायथन में है, जिसमें ऐसी कई संरचनाएं हैं। चूंकि असाइनमेंट स्टेटमेंट हैं, ऑपरेशन नहीं, इसलिए असाइनमेंट ऑपरेटर का कोई मूल्य नहीं है और वह सहयोगी नहीं है। इसके अतिरिक्त जंजीर असाइनमेंट को असाइनमेंट के अनुक्रमों के लिए एक व्याकरण नियम द्वारा कार्यान्वित किया जाता है, जिसे फिर बाएं से दाएं असाइन किया जाता है। इसके अतिरिक्त, असाइनमेंट और संवर्धित असाइनमेंट के संयोजन, जैसे  पायथन में वैध नहीं हैं, हालांकि वे C में वैध हैं। एक अन्य उदाहरण तुलना ऑपरेटर हैं, जैसे  ,  , और. जैसी श्रृंखलाबद्ध तुलना की व्याख्या  के रूप में की जाती है, जो कि   या   के समान नहीं है।

यह भी देखें

 * संचालन का क्रम (अंकगणित और बीजगणित में)
 * सामान्य ऑपरेटर संकेतन (प्रोग्रामिंग भाषाओं में)
 * सहयोगिता (सहयोगिता का गणितीय गुण)