असाइनमेंट (कंप्यूटर विज्ञान)
कंप्यूटर प्रोग्रामिंग में, एक असाइनमेंट स्टेटमेंट एक चर (प्रोग्रामिंग) नाम द्वारा दर्शाए गए भंडारण स्थान (स्थानों) में संग्रहीत मूल्य (कंप्यूटर विज्ञान) को सेट या फिर से सेट करता है; दूसरे शब्दों में, यह एक मान को चर में कॉपी करता है। अधिकांश अनिवार्य प्रोग्रामिंग भाषाओं में, असाइनमेंट स्टेटमेंट (या एक्सप्रेशन) एक मौलिक निर्माण है।
आज, इस ऑपरेशन के लिए सबसे अधिक उपयोग किया जाने वाला नोटेशन है x = expr
(मूल रूप से सुपरप्लान 1949-51, फोरट्रान 1957 और सी (प्रोग्रामिंग भाषा) द्वारा लोकप्रिय) है। दूसरा सबसे अधिक उपयोग किया जाने वाला संकेतन[1] x := expr
(मूल रूप से अल्गोल 1958, पास्कल (प्रोग्रामिंग भाषा) द्वारा लोकप्रिय) है।[2] कई अन्य संकेतन भी उपयोग में हैं। कुछ भाषाओं में, प्रयुक्त प्रतीक को एक ऑपरेटर (प्रोग्रामिंग) के रूप में माना जाता है (जिसका अर्थ है कि असाइनमेंट स्टेटमेंट एक संपूर्ण मान देता है)। अन्य भाषाएँ असाइनमेंट को एक कथन के रूप में परिभाषित करती हैं (जिसका अर्थ है कि इसे किसी व्यंजक में उपयोग नहीं किया जा सकता है)।
असाइनमेंट सामान्यतः एक चर को उसके जीवन-काल और दायरे (प्रोग्रामिंग) के दौरान अलग-अलग समय पर अलग-अलग मान रखने की अनुमति देते हैं। चूंकि, कुछ भाषाएँ (मुख्य रूप से कार्यात्मक प्रोग्रामिंग भाषाएँ) उस तरह के विनाशकारी पुनर्मूल्यांकन की अनुमति नहीं देती हैं, क्योंकि यह गैर-स्थानीय स्थिति के परिवर्तन को प्रभावित कर सकता है। इसका उद्देश्य संदर्भित पारदर्शिता को लागू करना है, अर्थात ऐसे कार्य जो कुछ चर (ओं) की स्थिति पर निर्भर नहीं होते हैं, लेकिन किसी भी समय पैरामीट्रिक इनपुट के दिए गए सेट के लिए समान परिणाम उत्पन्न करते हैं। अन्य भाषाओं में आधुनिक कार्यक्रम भी अधिकांशतः समान रणनीतियों का उपयोग करते हैं, चूंकि कम सख्त, और केवल कुछ हिस्सों में, जटिलता को कम करने के लिए, सामान्य रूप से डेटा संरचनाओं, संरचित प्रोग्रामिंग और ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग जैसे पूरक तरीकों के संयोजन के साथ।
शब्दार्थ
एक असाइनमेंट ऑपरेशन अनिवार्य प्रोग्रामिंग में एक प्रक्रिया है जिसमें समय बीतने के साथ अलग-अलग मान एक विशेष चर नाम से जुड़े होते हैं।[1] इस तरह के मॉडल में कार्यक्रम लगातार असाइनमेंट स्टेटमेंट्स का उपयोग करके अपनी स्थिति को बदलकर संचालित होता है।[2][3] अनिवार्य प्रोग्रामिंग भाषाओं के पुरातन पुनरावृति करने के लिए असाइनमेंट पर निर्भर करते हैं।[4] निम्नतम स्तर पर, मूव
या स्टोर
जैसे मशीन संचालन का उपयोग करके असाइनमेंट कार्यान्वित किया जाता है।[2][4]
चर (प्रोग्रामिंग) मूल्यों के लिए कंटेनर हैं। एक मान को एक चर में रखना और पश्चात में इसे एक नए से बदलना संभव है। एक असाइनमेंट ऑपरेशन निष्पादन कार्यक्रम की वर्तमान स्थिति को संशोधित करता है।[3]परिणामस्वरूप, असाइनमेंट चर (प्रोग्रामिंग) की अवधारणा पर निर्भर है। एक असाइनमेंट में:
- कार्यक्रम की वर्तमान स्थिति में
व्यंजक
का मूल्यांकन किया जाता है। चर
को परिकलित मान निर्दिष्ट किया जाता है, जो उस चर के पूर्व मान को प्रतिस्थापित करता है।
उदाहरण: यह मानते हुए कि a एक संख्यात्मक चर है, असाइनमेंट a := 2*a
अर्थ है कि कथन के निष्पादन के पश्चात चर a
की सामग्री दोगुनी हो जाती है।
सी (प्रोग्रामिंग भाषा) कोड का एक उदाहरण खंड:
<वाक्यविन्यास प्रकाश लैंग = सी>
इंट एक्स = 10;
फ्लोट वाई;
एक्स = 23; वाई = 32.4f;
</वाक्यविन्यास हाइलाइट>
इस नमूने में, चर x
को पहले एक int के रूप में घोषित किया जाता है, और फिर इसे 10 का मान निर्दिष्ट किया जाता है। ध्यान दें कि घोषणा और असाइनमेंट एक ही कथन में होते हैं। दूसरी पंक्ति में, y
बिना असाइनमेंट के घोषित किया जाता है। तीसरी पंक्ति में, x
को 23 का मान पुन: असाइन किया गया है। अंत में, y
को 32.4 का मान असाइन किया गया है।
एक असाइनमेंट ऑपरेशन के लिए, यह आवश्यक है कि व्यंजक
का मान अच्छी तरह से परिभाषित हो (यह एक वैध प्रतिद्वंद्विता है) और यह कि चर
एक परिवर्तनीय इकाई का प्रतिनिधित्व करता है (यह एक वैध परिवर्तनीय (गैर-स्थिरांक) अंतराल है)। कुछ भाषाओं में, विशेष रूप से गतिशील प्रोग्रामिंग भाषाओं में, किसी चर को मान निर्दिष्ट करने से पहले उसे घोषित करना आवश्यक नहीं होता है। ऐसी भाषाओं में, एक चर को पहली बार असाइन किए जाने पर स्वचालित रूप से घोषित किया जाता है, इसके दायरे को भाषा के अनुसार अलग-अलग घोषित किया जाता है।
एकल असाइनमेंट
कोई भी असाइनमेंट जो किसी उपस्थिता मान को बदलता है (उदा। x := x + 1
) विशुद्ध रूप से कार्यात्मक प्रोग्रामिंग भाषाओं में अस्वीकृत है।[4]कार्यात्मक प्रोग्रामिंग में, एकल असाइनमेंट के पक्ष में असाइनमेंट को हतोत्साहित किया जाता है, जिसे इनिशियलाइज़ेशन भी कहा जाता है। एकल असाइनमेंट नाम बाध्यकारी का एक उदाहरण है और इस आलेख में वर्णित असाइनमेंट से अलग है कि यह केवल एक बार किया जा सकता है, सामान्यतः जब वेरिएबल बनाया जाता है; किसी पश्चात के पुनर्मूल्यांकन की अनुमति नहीं है।
व्यंजक के मूल्यांकन का कोई साइड इफेक्ट नहीं होता है (कंप्यूटर विज्ञान) यदि यह मशीन की अवलोकन योग्य स्थिति को नहीं बदलता है,[5] और समान इनपुट के लिए समान मान उत्पन्न करता है।[4]अनिवार्य असाइनमेंट पुराने मूल्य को नष्ट करते समय साइड इफेक्ट्स पेश कर सकता है और इसे एक नए के साथ प्रतिस्थापित करते समय अनुपलब्ध कर सकता है,[6] और इसे विनाशकारी अद्यतन के समान LISP और कार्यात्मक प्रोग्रामिंग में उस कारण के लिए विनाशकारी असाइनमेंट के रूप में संदर्भित किया जाता है।
एकल असाइनमेंट विशुद्ध रूप से कार्यात्मक भाषाओं में उपलब्ध असाइनमेंट का एकमात्र रूप है, जैसे हास्केल (प्रोग्रामिंग भाषा), जिसमें अनिवार्य प्रोग्रामिंग भाषाओं के अर्थ में चर नहीं होते हैं।[4]बल्कि उनके तत्वों के साथ संभवतः मिश्रित प्रकृति के निरंतर मूल्यों को नामित किया गया है जो मांग पर उत्तरोत्तर परिभाषित होते हैं। विशुद्ध रूप से कार्यात्मक भाषाएं एक समय निष्पादन में अनुक्रमिक एक कदम की वॉन न्यूमैन अड़चन से बचने के लिए समानांतर कंप्यूटिंग में गणना करने का अवसर प्रदान कर सकती हैं, क्योंकि मूल्य एक दूसरे से स्वतंत्र हैं।[7]
अशुद्ध कार्यात्मक भाषाएँ एकल असाइनमेंट के साथ-साथ सही असाइनमेंट दोनों प्रदान करती हैं (हालाँकि सही असाइनमेंट सामान्यतः अनिवार्य प्रोग्रामिंग भाषाओं की तुलना में कम आवृत्ति के साथ उपयोग किया जाता है)। उदाहरण के लिए, योजना में, एकल असाइनमेंट ( let के साथ
) और ट्रू असाइनमेंट (set के साथ
) उदाहरण के लिए, योजना में, एकल असाइनमेंट (लेट के साथ) और ट्रू असाइनमेंट (सेट के साथ!) दोनों का उपयोग सभी चर पर किया जा सकता है, और सूचियों, वैक्टर, स्ट्रिंग्स आदि के अंदर विनाशकारी अद्यतन के लिए विशेष पुरातन प्रदान किए जाते हैं। OCaml में, चर के लिए केवल एक असाइनमेंट की अनुमति है, let name = value
सिंटैक्स के माध्यम से; चूंकि अलग-अलग <-
ऑपरेटर के साथ सरणी और तारों के तत्वों पर विनाशकारी अद्यतन का उपयोग किया जा सकता है, साथ ही रिकॉर्ड और ऑब्जेक्ट्स के क्षेत्रों पर भी प्रोग्रामर द्वारा स्पष्ट रूप से उत्परिवर्तनीय घोषित किया गया है (अर्थात् उनकी प्रारंभिक घोषणा के पश्चात परिवर्तित होने में सक्षम)।
एकल असाइनमेंट का उपयोग करने वाली कार्यात्मक प्रोग्रामिंग भाषाओं में क्लोजर (डेटा संरचनाओं के लिए, वर्र्स नहीं), एरलांग (प्रोग्रामिंग भाषा) (हास्केल के विपरीत मान बराबर होने पर एकाधिक असाइनमेंट स्वीकार करता है), एफ #, हास्केल (प्रोग्रामिंग लैंग्वेज), जावास्क्रिप्ट (स्थिरांक के लिए), लावा (प्रोग्रामिंग भाषा), ओकैमल, Oz (प्रोग्रामिंग लैंग्वेज) (डेटाफ्लो वेरिएबल्स के लिए, सेल नहीं), रैकेट (प्रोग्रामिंग भाषा)(कुछ डेटा संरचनाओं जैसे सूचियों के लिए, प्रतीकों के लिए नहीं), एसएएसएल (प्रोग्रामिंग लैंग्वेज), स्काला (प्रोग्रामिंग भाषा) (वैल्स के लिए), एक प्रकार का पौधा, मानक एमएल। गैर-बैक ट्रैकिंग प्रोलॉग कोड को स्पष्ट एकल-असाइनमेंट माना जा सकता है, इस अर्थ में स्पष्ट है कि इसके (नामित) चर स्पष्ट रूप से अनिर्दिष्ट अवस्था में हो सकते हैं, या ठीक एक बार सेट किए जा सकते हैं। हास्केल में, इसके विपरीत, कोई अनिर्दिष्ट चर नहीं हो सकता है, और प्रत्येक चर को निहित रूप से सेट होने के बारे में सोचा जा सकता है, जब इसे बनाया जाता है, इसके मूल्य पर (या बल्कि एक कम्प्यूटेशनल ऑब्जेक्ट के लिए जो मांग पर इसके मूल्य का उत्पादन करेगा)।
एक असाइनमेंट का मूल्य
कुछ प्रोग्रामिंग भाषाओं में, एक असाइनमेंट स्टेटमेंट एक मान लौटाता है, जबकि अन्य में ऐसा नहीं होता है।
अधिकांश व्यंजक-उन्मुख प्रोग्रामिंग भाषाओं में (उदाहरण के लिए, C (प्रोग्रामिंग भाषा)), असाइनमेंट स्टेटमेंट असाइन किए गए मान को लौटाता है, ऐसे मुहावरों को अनुमति देता है x = y = a
, जिसमें असाइनमेंट स्टेटमेंट y = a
का मान लौटाता है a
, जिसे तब असाइन किया जाता हैx को।
जबकि while ((ch = getchar()) != EOF) {…}
, जैसे स्टेटमेंट में, किसी फ़ंक्शन के रिटर्न मान का उपयोग लूप को नियंत्रित करने के लिए किया जाता है, जबकि वेरिएबल को समान मान निर्दिष्ट करते हैं। अन्य प्रोग्रामिंग भाषाओं में, योजना (प्रोग्रामिंग भाषा) उदाहरण के लिए, एक असाइनमेंट का वापसी मान अपरिभाषित है और ऐसे सिद्धप्रयोग अमान्य हैं।
हास्केल (प्रोग्रामिंग भाषा) में,[8] कोई चर असाइनमेंट नहीं है; लेकिन असाइनमेंट के समान संचालन (जैसे किसी सरणी के क्षेत्र या एक परिवर्तनीय डेटा संरचना के क्षेत्र को असाइन करना) सामान्यतः इकाई प्रकार का मूल्यांकन करता है, जिसे ()
के रूप में दर्शाया जाता है। इस प्रकार का केवल एक संभावित मान है, इसलिए इसमें कोई जानकारी नहीं है। यह सामान्यतः एक व्यंजक का प्रकार है जिसका मूल्यांकन पूरी तरह से इसके दुष्प्रभावों के लिए किया जाता है।
असाइनमेंट के भिन्न रूप
कुछ उपयोग पैटर्न बहुत सामान्य हैं, और इस प्रकार अधिकांशतः उनका समर्थन करने के लिए विशेष सिंटैक्स होते हैं। स्रोत कोड में अतिरेक को कम करने के लिए ये मुख्य रूप से सिंटैक्टिक चीनी हैं, लेकिन प्रोग्रामर के उद्देश्य को समझने में कोड के पाठकों की सहायता भी करते हैं, और संकलक को संभावित अनुकूलन के लिए एक सुराग प्रदान करते हैं।
संवर्धित असाइनमेंट
मामला जहां निर्दिष्ट मूल्य पिछले एक पर निर्भर करता है, इतना सामान्य है कि कई अनिवार्य भाषाएं, विशेष रूप से सी और इसके वंशजों में से अधिकांश, संवर्धित असाइनमेंट नामक विशेष ऑपरेटर प्रदान करते हैं, जैसे *=
, इसलिए इसके बजाय लिखा जा सकता हैa = 2*a
के रूप में। लिखा जा सकता है [3] सिंटैक्टिक चीनी से परे, यह संकलक के कार्य को स्पष्ट करके सहायता करता है कि वेरिएबल a
के इन-प्लेस में संशोधन संभव है।
जंजीर असाइनमेंट
जैसा कथन w = x = y = z
को जंजीर असाइनमेंट कहा जाता है जिसमें z
का मान एकाधिक चर w, x,
और y
. को नियत किया जाता है। जंजीर असाइनमेंट का उपयोग अधिकांशतः कई चरों को आरंभ करने के लिए किया जाता है, जैसे कि
a = b = c = d = f = 0
सभी प्रोग्रामिंग लैंग्वेज जंजीर असाइनमेंट का समर्थन नहीं करती हैं। जंजीर असाइनमेंट असाइनमेंट के अनुक्रम के बराबर हैं, लेकिन मूल्यांकन की रणनीति भाषाओं के बीच भिन्न होती है। सरल जंजीर असाइनमेंट के लिए, जैसे कई चर प्रारंभ करना, मूल्यांकन रणनीति कोई मायने नहीं रखती है, लेकिन यदि असाइनमेंट में लक्ष्य (एल-वैल्यू) किसी तरह से जुड़े हुए हैं, तो मूल्यांकन रणनीति परिणाम को प्रभावित करती है।
कुछ प्रोग्रामिंग भाषाओं (उदाहरण के लिए C (प्रोग्रामिंग लैंग्वेज)) में, जंजीर असाइनमेंट समर्थित हैं क्योंकि असाइनमेंट एक्सप्रेशन हैं, और मान हैं। इस मामले में चेन असाइनमेंट को राइट-एसोसिएटिव असाइनमेंट करके लागू किया जा सकता है, और असाइनमेंट राइट-टू-लेफ्ट होते हैं। उदाहरण के लिए, i = arr[i] = f()
के बराबर है arr[i] = f(); i = arr[i]
. सी ++ में वे असाइनमेंट ऑपरेटर के लिए उचित रिटर्न प्रकार घोषित करके वर्ग प्रकारों के मूल्यों के लिए भी उपलब्ध हैं।
पायथन (प्रोग्रामिंग लैंग्वेज) में, असाइनमेंट स्टेटमेंट एक्सप्रेशन नहीं हैं और इसलिए इसका कोई मूल्य नहीं है। इसके बजाय, जंजीर असाइनमेंट एक व्यंजक के लिए कई लक्ष्यों वाले बयानों की एक श्रृंखला है।असाइनमेंट को बाएं से दाएं निष्पादित किया जाता है जिससे कि i = arr[i] = f()
व्यंजक f()
का मूल्यांकन करे, फिर परिणाम को सबसे बाएं लक्ष्य i
पर असाइन करें, और फिर उसी परिणाम को अगले लक्ष्य को असाइन करें, arr[i],i
के नए मान का उपयोग करते हुए।[9] यह अनिवार्य रूप सेtmp = f(); के बराबर है i = tmp; arr[i] = tmp
चूंकि अस्थायी मान के लिए कोई वास्तविक चर उत्पन्न नहीं होता है।
समानांतर असाइनमेंट
कुछ प्रोग्रामिंग लैंग्वेज, जैसे एपीएल (प्रोग्रामिंग भाषा), सामान्य लिस्प,[10] जाओ (प्रोग्रामिंग भाषा),[11] जावास्क्रिप्ट (1.7 के पश्चात से), पीएचपी, मेपल (सॉफ्टवेयर), लुआ (प्रोग्रामिंग भाषा), ओकम (प्रोग्रामिंग भाषा),[12] पर्ल,[13] पायथन (प्रोग्रामिंग भाषा),[14] रेबोल, रूबी (प्रोग्रामिंग भाषा),[15] और पॉवरशेल कई वेरिएबल्स को समानांतर में असाइन करने की अनुमति देते हैं, जैसे सिंटैक्स के साथ:
ए, बी: = 0, 1
जो एक साथ 0 को a
और 1 को b
असाइन करता है। इसे अधिकांशतः समांतर असाइनमेंट के रूप में जाना जाता है; इसे सीपीएल में 1963 में समकालिक असाइनमेंट के नाम से पेश किया गया था,[16] और कभी-कभी इसे एकाधिक असाइनमेंट कहा जाता है, चूंकि "एकल असाइनमेंट" के साथ उपयोग किए जाने पर यह भ्रमित करने वाला होता है, क्योंकि ये विपरीत नहीं होते हैं। यदि असाइनमेंट का दाहिना भाग एक एकल चर (उदाहरण के लिए एक सरणी या संरचना) है, तो सुविधा को अनपैकिंग[17] या विनाशकारी असाइनमेंट कहा जाता है[18]
वार सूची := {0, 1}
ए, बी: = सूची
सूची को अनपैक किया जाएगा जिससे कि 0 कोa और 1 को b
असाइन किया जा सके।
ए, बी: = बी, ए
a
और b
के मानों की अदला-बदली करता है। समांतर असाइनमेंट के बिना भाषाओं में, इसे अस्थायी चर का उपयोग करने के लिए लिखा जाना होगा
वार टी := ए अ := ख ख := टी
तब से a := b; b := a,a
और b
दोनों कोb
के मूल मान के साथ छोड़ देता है।
कुछ भाषाएँ, जैसे कि गो और पायथन, समानांतर असाइनमेंट, ट्यूपल्स और स्वचालित ट्यूपल अनपैकिंग को एक ही फ़ंक्शन से कई रिटर्न वैल्यू की अनुमति देने के लिए जोड़ती हैं, जैसा कि इस पायथन उदाहरण में है,
<वाक्यविन्यास लैंग = अजगर>
डेफ एफ ():
वापसी 1, 2
ए, बी = एफ ()
</वाक्यविन्यास हाइलाइट>
जबकि अन्य भाषाएँ, जैसे कि C शार्प (प्रोग्रामिंग लैंग्वेज) और जंग (प्रोग्रामिंग भाषा), यहाँ दिखाई गई हैं, जिनमें कोष्ठकों के साथ स्पष्ट टपल निर्माण और विखंडन की आवश्यकता होती है:
<वाक्यविन्यास प्रकाश लैंग = सी शार्प>
// मान्य सी # या जंग सिंटैक्स
(ए, बी) = (बी, ए);
</वाक्यविन्यास हाइलाइट>
<वाक्यविन्यास प्रकाश लैंग = सी शार्प>
// सी # टपल वापसी
(स्ट्रिंग, इंट) f() => (फू, 1);
वर (ए, बी) = च ();
</वाक्यविन्यास हाइलाइट>
<वाक्यविन्यास प्रकाश लैंग = जंग>
// रस्ट टपल रिटर्न चलो एफ = || (फू, 1);
चलो (ए, बी) = एफ ();
</वाक्यविन्यास हाइलाइट>
यह फ़ंक्शन से एकाधिक मान वापस करने के लिए आउटपुट पैरामीटर के उपयोग का विकल्प प्रदान करता है। यह CLU (प्रोग्रामिंग लैंग्वेज) (1974) की तारीख है, और CLU ने समानांतर असाइनमेंट को सामान्यतः लोकप्रिय बनाने में मदद की।
सी # अतिरिक्त रूप से दाहिने हाथ की ओर व्यंजक द्वारा परिभाषित कार्यान्वयन के साथ सामान्यीकृत डिकंस्ट्रक्शन असाइनमेंट की अनुमति देता है, क्योंकि कंपाइलर व्यंजक पर उपयुक्त उदाहरण विधि या विस्तार विधि की खोज Deconstruct करता है, जिसमें वेरिएबल्स को असाइन किए जाने के लिए आउटपुट पैरामीटर होना चाहिए।[19] उदाहरण के लिए, एक ऐसी विधि जो कक्षा (कंप्यूटर प्रोग्रामिंग) को उसी व्यवहार में प्रकट करेगी जो, उपरोक्त f()
के वापसी मूल्य के रूप में होगी
<वाक्यविन्यास प्रकाश लैंग = सी शार्प>
शून्य डिकंस्ट्रक्ट (आउट स्ट्रिंग ए, आउट इंट बी) {ए = फू; बी = 1; }
</वाक्यविन्यास हाइलाइट>
C और C++ में, अल्पविराम संचालिका समानांतर असाइनमेंट के समान है, जिससे एक ही कथन के भीतर कई असाइनमेंट होने की अनुमति मिलती है,a = 1, b = 2
के बजाय a, b = 1, 2 लिखता है।
यह मुख्य रूप से लूप के लिए उपयोग किया जाता है, और इसे गो जैसी अन्य भाषाओं में समांतर असाइनमेंट द्वारा प्रतिस्थापित किया जाता है।[20]
हालाँकि, उपरोक्त C++ कोड पूर्ण समकालिकता सुनिश्चित नहीं करता है, क्योंकि निम्न कोड के दाईं ओर a = b, b = a+1 का मूल्यांकन बाईं ओर के पश्चात किया जाता है। पायथन जैसी भाषाओं में, a, b = b, a+1
नए b की गणना करने के लिए a के प्रारंभिक मान का उपयोग करते हुए, समवर्ती रूप से दो चर निर्दिष्ट करेगा।
असाइनमेंट बनाम समानता
समानता के लिए तुलना के रूप में बराबरी के साथ संघर्ष के कारण, बराबर चिह्न =
को एक असाइनमेंट ऑपरेटर के रूप में उपयोग करने के लिए अधिकांशतः आलोचना की गई है। इसके परिणामस्वरूप लेखन कोड में नवदीक्षित द्वारा भ्रम पैदा होता है, और कोड पढ़ने में अनुभवी प्रोग्रामरों के द्वारा भी भ्रम होता है। समनुदेशन के लिए बराबरी का उपयोग हेंज रुतिशौसर की भाषा सुपरप्लान से शुरू होता है, जिसे 1949 से 1951 तक डिजाइन किया गया था, और विशेष रूप से फोरट्रान द्वारा लोकप्रिय किया गया था:
A notorious example for a bad idea was the choice of the equal sign to denote assignment. It goes back to Fortran in 1957[lower-alpha 1] and has blindly been copied by armies of language designers. Why is it a bad idea? Because it overthrows a century old tradition to let “=” denote a comparison for equality, a predicate which is either true or false. But Fortran made it to mean assignment, the enforcing of equality. In this case, the operands are on unequal footing: The left operand (a variable) is to be made equal to the right operand (an expression). x = y does not mean the same thing as y = x.[21]
— Niklaus Wirth, Good Ideas, Through the Looking Glass
प्रारंभी प्रोग्रामर कभी-कभी समानता के लिए रिलेशनल ऑपरेटर के साथ असाइनमेंट को भ्रमित करते हैं, जैसा कि = अर्थ गणित में समानता (गणित) है, और कई भाषाओं में असाइनमेंट के लिए उपयोग किया जाता है। लेकिन असाइनमेंट एक चर के मान को बदल देता है, जबकि समानता परीक्षण जाँच करता है कि क्या दो व्यंजक का मूल्य समान है।
कुछ भाषाओं में, जैसे कि बुनियादी, एक समान चिह्न ("=") का उपयोग असाइनमेंट ऑपरेटर और समानता संबंधपरक ऑपरेटर दोनों के लिए किया जाता है, जिसमें संदर्भ निर्धारित होता है। अन्य भाषाएं दो ऑपरेटरों के लिए अलग-अलग प्रतीकों का उपयोग करती हैं। उदाहरण के लिए:
- अल्गोल और पास्कल (प्रोग्रामिंग लैंग्वेज) में, असाइनमेंट ऑपरेटर एक कोलन और एक बराबर का चिह्न (
":="
) जबकि समानता संकारक एकल बराबर है ("="
). - सी (प्रोग्रामिंग लैंग्वेज) में, असाइनमेंट ऑपरेटर एक सिंगल इक्वल साइन (
"="
) जबकि समानता ऑपरेटर बराबर चिह्नों की एक जोड़ी है ("=="
). - आर (प्रोग्रामिंग लैंग्वेज) में, असाइनमेंट ऑपरेटर मूल रूप से होता है
<-
, के रूप मेंx <- value
, लेकिन कुछ संदर्भों में एकल बराबर चिह्न का उपयोग किया जा सकता है।
दो प्रतीकों में समानता त्रुटियों का कारण बन सकती है यदि प्रोग्रामर भूल जाता है कि कौन सा फॉर्म (=
,==
,:=
) उपयुक्त है, या गलत प्रकार "=
" जब ==
का आशय रखता है। यह सी जैसी भाषाओं के साथ एक सामान्य प्रोग्रामिंग समस्या है (लिनक्स कर्नेल के पिछले दरवाजे के लिए एक प्रसिद्ध प्रयास सहित),[22] जहां असाइनमेंट ऑपरेटर निर्दिष्ट मान भी लौटाता है (उसी तरह जिस तरह एक फ़ंक्शन एक मान लौटाता है), और वैध रूप से व्यंजकयों के अंदर नेस्टेड किया जा सकता है। उदाहरण के लिए, यदि किसी कथन में दो मानों की तुलना करने का आशय था, if
उदाहरण के लिए, एक असाइनमेंट बूलियन सत्य के रूप में व्याख्या करने योग्य मान वापस करने की संभावना है, जिस स्थिति में तत्कालीन then
खंड निष्पादित किया जाएगा, जिससे प्रोग्राम अप्रत्याशित रूप से व्यवहार करेगा। कुछ भाषा प्रोसेसर (जैसे जीसीसी) ऐसी स्थितियों का पता लगा सकते हैं, और संभावित त्रुटि के प्रोग्रामर को चेतावनी दे सकते हैं।
नोटेशन
कॉपी करने के असाइनमेंट के लिए दो सबसे सामान्य प्रतिनिधित्व बराबर चिह्न (=
) और कोलन-बराबर (:=
) हैं। भाषा और उपयोग के आधार पर दोनों रूपों को या तो असाइनमेंट स्टेटमेंट या असाइनमेंट ऑपरेटर (जिसका मूल्य भी है) को शब्दार्थ रूप से निरूपित किया जा सकता है।
चर = व्यंजक
फोरट्रान, पीएल/आई, सी (और वंशज जैसे सी ++, जावा, आदि), बॉर्न शेल, पायथन, गो (पूर्व-घोषित चर के लिए असाइनमेंट), आर, पॉवरशेल, निम, आदि। चर := व्यंजक
अल्गोल (और डेरिवेटिव), सिमुला, सीपीएल, बीसीपीएल, पास्कल[23] (और मोडुला जैसे वंशज), मैरी, पीएल/एम, एडा, स्मॉलटाक, एफिल,[24][25] ओबेरॉन, डायलन,[26] सीड7, पायथन एक असाइनमेंट एक्सप्रेशन),[27] गो (एक चर घोषित करने और परिभाषित करने के लिए आशुलिपि),[28] आईओ, एएमपीएल, एमएल (संदर्भ मान निर्दिष्ट करना)[29] ऑटोहॉट्की आदि।.
अन्य संभावनाओं में एक बायां तीर या एक कीवर्ड सम्मलित है, चूंकि अन्य, दुर्लभ, वेरिएंट हैं:
चर << व्यंजक
मैजिक चर <- व्यंजक
एफ #, ओकैमल, आर, एस चर <<- व्यंजक
आर असाइन("चर", व्यंजक)
आर चर ← व्यंजक
एपीएल,[30] स्मॉलटॉक, बेसिक प्रोग्रामिंग चर =: व्यंजक
जे LET चर = व्यंजक
बेसिक let चर := व्यंजक
एक्सक्वेरी सेट चर को व्यंजक
एप्पलस्क्रिप्ट सेट चर = व्यंजक
सी शैल सेट-चर चर (व्यंजक)
पावरशेल चर : व्यंजक
मैक्सिमा, मैक्सिमा, के चर: व्यंजक
रिबोल वर चर व्यंजक
एमआईआरसी स्क्रिप्टिंग भाषा रेफरेंस-चर :- रेफरेंस-व्यंजक
सिमुला
गणितीय स्यूडोकोड असाइनमेंट सामान्यतः बाएं-तीर के साथ दर्शाए जाते हैं।
कुछ प्लेटफ़ॉर्म व्यंजक को बाईं ओर और चर को दाईं ओर रखते हैं:
मूव व्यंजक को चर में
कोबोल व्यंजक → चर
टीआई-बेसिक, कैसियो बेसिक व्यंजक -> चर
पीओपी-2, बीटा, आर व्यंजक
को चर में रखें
लाइवकोड पुट व्यंजक चर में
एबीसी
कुछ व्यंजक-उन्मुख भाषाएँ, जैसे कि लिस्प (प्रोग्रामिंग भाषा)[31][32] और टीसीएल, समान रूप से असाइनमेंट सहित सभी बयानों के लिए उपसर्ग (या पोस्टफिक्स) सिंटैक्स का उपयोग करती हैं।
(सेटफ चर व्यंजक)
सामान्य लिस्प (सेट! चर व्यंजक)
स्कीम[33][34][35] सेट चर व्यंजक
टीसीएल व्यंजक चर !
फोर्थ
यह भी देखें
- सी ++ में असाइनमेंट ऑपरेटर
- ऑपरेटर (प्रोग्रामिंग)
- नाम बंधन
- एकीकरण (कम्प्यूटिंग)
- अपरिवर्तनीय वस्तु
- कॉन्स्ट-शुद्धता
टिप्पणियाँ
- ↑ Use of
=
predates Fortran, though it was popularized by Fortran.
संदर्भ
- ↑ 1.0 1.1 "2cs24 Declarative". www.csc.liv.ac.uk. Archived from the original on 24 April 2006. Retrieved 20 April 2018.
- ↑ 2.0 2.1 2.2 "Imperative Programming". uah.edu. Retrieved 20 April 2018.
- ↑ 3.0 3.1 3.2 Ruediger-Marcus Flaig (2008). Bioinformatics programming in Python: a practical course for beginners. Wiley-VCH. pp. 98–99. ISBN 978-3-527-32094-3. Retrieved 25 December 2010.
- ↑ 4.0 4.1 4.2 4.3 4.4 Crossing borders: Explore functional programming with Haskell Archived November 19, 2010, at the Wayback Machine, by Bruce Tate
- ↑ Mitchell, John C. (2003). Concepts in programming languages. Cambridge University Press. p. 23. ISBN 978-0-521-78098-8. Retrieved 3 January 2011.
- ↑ "Imperative Programming Languages (IPL)" (PDF). gwu.edu. Retrieved 20 April 2018.
- ↑ John C. Mitchell (2003). Concepts in programming languages. Cambridge University Press. pp. 81–82. ISBN 978-0-521-78098-8. Retrieved 3 January 2011.
- ↑ Hudak, Paul (2000). The Haskell School of Expression: Learning Functional Programming Through Multimedia. Cambridge: Cambridge University Press. ISBN 0-521-64408-9.
- ↑ "7. Simple statements — Python 3.6.5 documentation". docs.python.org. Retrieved 20 April 2018.
- ↑ "CLHS: Macro SETF, PSETF". Common Lisp Hyperspec. LispWorks. Retrieved 23 April 2019.
- ↑ The Go Programming Language Specification: Assignments
- ↑ INMOS Limited, ed. (1988). Occam 2 Reference Manual. New Jersey: Prentice Hall. ISBN 0-13-629312-3.
- ↑ Wall, Larry; Christiansen, Tom; Schwartz, Randal C. (1996). Perl Programming Language (2 ed.). Cambridge: O´Reilly. ISBN 1-56592-149-6.
- ↑ Lutz, Mark (2001). Python Programming Language (2 ed.). Sebastopol: O´Reilly. ISBN 0-596-00085-5.
- ↑ Thomas, David; Hunt, Andrew (2001). Programming Ruby: The Pragmatic Programmer's Guide. Upper Saddle River: Addison Wesley. ISBN 0-201-71089-7.
- ↑ D.W. Barron et al., "The main features of CPL", Computer Journal 6:2:140 (1963). full text (subscription)
- ↑ "PEP 3132 -- Extended Iterable Unpacking". legacy.python.org. Retrieved 20 April 2018.
- ↑ "Destructuring assignment". MDN Web Docs. Retrieved 20 April 2018.
- ↑ "Deconstructing tuples and other types". Microsoft Docs. Microsoft. Retrieved 29 August 2019.
- ↑ Effective Go: for, "Finally, Go has no comma operator and ++ and -- are statements not expressions. Thus if you want to run multiple variables in a for you should use parallel assignment (although that precludes ++ and --)."
- ↑ Niklaus Wirth. "Good Ideas, Through the Looking Glass". CiteSeerX 10.1.1.88.8309.
{{cite web}}
: Missing or empty|url=
(help) - ↑ Corbet (6 November 2003). "An attempt to backdoor the kernel".
- ↑ Moore, Lawrie (1980). Foundations of Programming with Pascal. New York: John Wiley & Sons. ISBN 0-470-26939-1.
- ↑ Meyer, Bertrand (1992). Eiffel the Language. Hemel Hempstead: Prentice Hall International(UK). ISBN 0-13-247925-7.
- ↑ Wiener, Richard (1996). An Object-Oriented Introduction to Computer Science Using Eiffel. Upper Saddle River, New Jersey: Prentice Hall. ISBN 0-13-183872-5.
- ↑ Feinberg, Neal; Keene, Sonya E.; Mathews, Robert O.; Withington, P. Tucker (1997). Dylan Programming. Massachusetts: Addison Wesley. ISBN 0-201-47976-1.
- ↑ "PEP 572 – Assignment Expressions". python.org. 28 February 2018. Retrieved 4 March 2020.
- ↑ "The Go Programming Language Specification - The Go Programming Language". golang.org. Retrieved 20 April 2018.
- ↑ Ullman, Jeffrey D. (1998). Elements of ML Programming: ML97 Edition. Englewood Cliffs, New Jersey: Prentice Hall. ISBN 0-13-790387-1.
- ↑ Iverson, Kenneth E. (1962). A Programming Language. John Wiley and Sons. ISBN 0-471-43014-5. Archived from the original on 2009-06-04. Retrieved 2010-05-09.
- ↑ Graham, Paul (1996). ANSI Common Lisp. New Jersey: Prentice Hall. ISBN 0-13-370875-6.
- ↑ Steele, Guy L. (1990). Common Lisp: The Language. Lexington: Digital Press. ISBN 1-55558-041-6.
- ↑ Dybvig, R. Kent (1996). The Scheme Programming Language: ANSI Scheme. New Jersey: Prentice Hall. ISBN 0-13-454646-6.
- ↑ Smith, Jerry D. (1988). Introduction to Scheme. New Jersey: Prentice Hall. ISBN 0-13-496712-7.
- ↑ Abelson, Harold; Sussman, Gerald Jay; Sussman, Julie (1996). Structure and Interpretation of Computer Programs. New Jersey: McGraw-Hill. ISBN 0-07-000484-6.