असाइनमेंट (कंप्यूटर विज्ञान): Difference between revisions
No edit summary |
|||
Line 151: | Line 151: | ||
== असाइनमेंट बनाम समानता == | == असाइनमेंट बनाम समानता == | ||
{{See also|Relational operator#Confusion with assignment operators}} | {{See also|Relational operator#Confusion with assignment operators}} | ||
समानता के लिए तुलना के रूप में बराबरी के साथ संघर्ष के कारण, बराबर चिह्न <code>=</code> का उपयोग एक असाइनमेंट ऑपरेटर के रूप में अक्सर आलोचना की गई है। इसके परिणामस्वरूप लेखन कोड में नवदीक्षित द्वारा भ्रम पैदा होता है, और कोड पढ़ने में अनुभवी प्रोग्रामरों द्वारा भी भ्रम होता है। समनुदेशन के लिए बराबरी का उपयोग हेंज रुतिशौसर की भाषा सुपरप्लान से शुरू होता है, जिसे 1949 से 1951 तक डिजाइन किया गया था, और विशेष रूप से फोरट्रान द्वारा लोकप्रिय किया गया था: | |||
{{blockquote|A notorious example for a bad idea was the choice of the equal sign to denote assignment. It goes back to Fortran in 1957{{efn|1=Use of <code>=</code> predates Fortran, though it was popularized by Fortran.}} 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 <nowiki>“=”</nowiki> 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). <nowiki>x = y</nowiki> does not mean the same thing as <nowiki>y = x</nowiki>.<ref>{{cite web |citeseerx=10.1.1.88.8309 |author=Niklaus Wirth |title=Good Ideas, Through the Looking Glass }}</ref>|[[Niklaus Wirth]]|''Good Ideas, Through the Looking Glass''}} | {{blockquote|A notorious example for a bad idea was the choice of the equal sign to denote assignment. It goes back to Fortran in 1957{{efn|1=Use of <code>=</code> predates Fortran, though it was popularized by Fortran.}} 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 <nowiki>“=”</nowiki> 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). <nowiki>x = y</nowiki> does not mean the same thing as <nowiki>y = x</nowiki>.<ref>{{cite web |citeseerx=10.1.1.88.8309 |author=Niklaus Wirth |title=Good Ideas, Through the Looking Glass }}</ref>|[[Niklaus Wirth]]|''Good Ideas, Through the Looking Glass''}} | ||
शुरुआती प्रोग्रामर कभी-कभी असाइनमेंट को समानता के लिए [[रिलेशनल ऑपरेटर]] के साथ भ्रमित | शुरुआती प्रोग्रामर कभी-कभी असाइनमेंट को समानता के लिए [[रिलेशनल ऑपरेटर]] के साथ असाइनमेंट को भ्रमित करते हैं, जैसा कि = अर्थ गणित में [[समानता (गणित)]] है, और कई भाषाओं में असाइनमेंट के लिए उपयोग किया जाता है। लेकिन असाइनमेंट एक चर के मान को बदल देता है, जबकि समानता परीक्षण जाँच करता है कि क्या दो अभिव्यक्ति का मूल्य समान है। | ||
कुछ भाषाओं में, जैसे कि [[बुनियादी]], एक बराबर चिह्न (<code>"="</code>) का उपयोग असाइनमेंट ऑपरेटर और समानता संबंधपरक ऑपरेटर दोनों के लिए किया जाता है, जिसका अर्थ संदर्भ निर्धारित करना है। अन्य भाषाएं दो ऑपरेटरों के लिए अलग-अलग प्रतीकों का उपयोग करती हैं। उदाहरण के लिए: | कुछ भाषाओं में, जैसे कि [[बुनियादी]], एक बराबर चिह्न (<code>"="</code>) का उपयोग असाइनमेंट ऑपरेटर और समानता संबंधपरक ऑपरेटर दोनों के लिए किया जाता है, जिसका अर्थ संदर्भ निर्धारित करना है। अन्य भाषाएं दो ऑपरेटरों के लिए अलग-अलग प्रतीकों का उपयोग करती हैं। उदाहरण के लिए: |
Revision as of 20:20, 27 February 2023
कंप्यूटर प्रोग्रामिंग में, एक असाइनमेंट स्टेटमेंट एक चर (प्रोग्रामिंग) नाम द्वारा दर्शाए गए भंडारण स्थान (स्थानों) में संग्रहीत मूल्य (कंप्यूटर विज्ञान) को सेट या फिर से सेट करता है; दूसरे शब्दों में, यह एक मान को चर में कॉपी करता है। अधिकांश अनिवार्य प्रोग्रामिंग भाषाओं में, असाइनमेंट स्टेटमेंट (या एक्सप्रेशन) एक मौलिक निर्माण है।
आज, इस ऑपरेशन के लिए सबसे अधिक इस्तेमाल किया जाने वाला नोटेशन है x = expr
(मूल रूप से सुपरप्लान 1949-51, फोरट्रान 1957 और सी (प्रोग्रामिंग भाषा) द्वारा लोकप्रिय)। दूसरा सबसे अधिक इस्तेमाल किया जाने वाला संकेतन[1] x := expr
(मूल रूप से ALGOL 1958, पास्कल (प्रोग्रामिंग भाषा) द्वारा लोकप्रिय) है।[2] कई अन्य संकेतन भी उपयोग में हैं। कुछ भाषाओं में, प्रयुक्त प्रतीक को एक ऑपरेटर (प्रोग्रामिंग) के रूप में माना जाता है (जिसका अर्थ है कि असाइनमेंट स्टेटमेंट एक संपूर्ण मान देता है)। अन्य भाषाएँ असाइनमेंट को एक कथन के रूप में परिभाषित करती हैं (जिसका अर्थ है कि इसे किसी अभिव्यक्ति में उपयोग नहीं किया जा सकता है)।
असाइनमेंट आमतौर पर एक चर को उसके जीवन-काल और दायरे (प्रोग्रामिंग) के दौरान अलग-अलग समय पर अलग-अलग मान रखने की अनुमति देते हैं। हालाँकि, कुछ भाषाएँ (मुख्य रूप से कार्यात्मक प्रोग्रामिंग भाषाएँ) उस तरह के विनाशकारी पुनर्मूल्यांकन की अनुमति नहीं देती हैं, क्योंकि यह गैर-स्थानीय स्थिति के परिवर्तन को प्रभावित कर सकता है। इसका उद्देश्य संदर्भित पारदर्शिता को लागू करना है, यानी ऐसे कार्य जो कुछ चर (ओं) की स्थिति पर निर्भर नहीं होते हैं, लेकिन किसी भी समय पैरामीट्रिक इनपुट के दिए गए सेट के लिए समान परिणाम उत्पन्न करते हैं। अन्य भाषाओं में आधुनिक कार्यक्रम भी अक्सर समान रणनीतियों का उपयोग करते हैं, हालांकि कम सख्त, और केवल कुछ हिस्सों में, जटिलता को कम करने के लिए, सामान्य रूप से डेटा संरचनाओं, संरचित प्रोग्रामिंग और ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग जैसे पूरक तरीकों के संयोजन के साथ।
शब्दार्थ
एक असाइनमेंट ऑपरेशन अनिवार्य प्रोग्रामिंग में एक प्रक्रिया है जिसमें समय बीतने के साथ अलग-अलग मान एक विशेष चर नाम से जुड़े होते हैं।[1] इस तरह के मॉडल में कार्यक्रम लगातार असाइनमेंट स्टेटमेंट्स का उपयोग करके अपनी स्थिति को बदलकर संचालित होता है।[2][3] अनिवार्य प्रोग्रामिंग भाषाओं के पुरातन पुनरावृति करने के लिए असाइनमेंट पर निर्भर करते हैं।[4] निम्नतम स्तर पर, MOVE
या STORE
जैसे मशीन संचालन का उपयोग करके असाइनमेंट कार्यान्वित किया जाता है।[2][4]
चर (प्रोग्रामिंग) मूल्यों के लिए कंटेनर हैं। एक मान को एक चर में रखना और बाद में इसे एक नए से बदलना संभव है। एक असाइनमेंट ऑपरेशन निष्पादन कार्यक्रम की वर्तमान स्थिति को संशोधित करता है।[3]नतीजतन, असाइनमेंट चर (प्रोग्रामिंग) की अवधारणा पर निर्भर है। एक असाइनमेंट में:
- कार्यक्रम की वर्तमान स्थिति में
expression
का मूल्यांकन किया जाता है। variable
को परिकलित मान निर्दिष्ट किया जाता है, जो उस चर के पूर्व मान को प्रतिस्थापित करता है।
उदाहरण: यह मानते हुए कि a एक संख्यात्मक चर है, असाइनमेंट a := 2*a
अर्थ है कि कथन के निष्पादन के बाद चर a
की सामग्री दोगुनी हो जाती है।
सी (प्रोग्रामिंग भाषा) कोड का एक उदाहरण खंड:
<वाक्यविन्यास प्रकाश लैंग = सी>
इंट एक्स = 10;
फ्लोट वाई;
एक्स = 23; वाई = 32.4f;
</वाक्यविन्यास हाइलाइट>
इस नमूने में, चर x
को पहले एक int के रूप में घोषित किया जाता है, और फिर इसे 10 का मान निर्दिष्ट किया जाता है। ध्यान दें कि घोषणा और असाइनमेंट एक ही कथन में होते हैं। दूसरी पंक्ति में, y
बिना असाइनमेंट के घोषित किया जाता है। तीसरी पंक्ति में, x
को 23 का मान पुन: असाइन किया गया है। अंत में, y
को 32.4 का मान असाइन किया गया है।
एक असाइनमेंट ऑपरेशन के लिए, यह आवश्यक है कि expression
का मान अच्छी तरह से परिभाषित हो (यह एक वैध प्रतिद्वंद्विता है) और यह कि variable
एक परिवर्तनीय इकाई का प्रतिनिधित्व करता है (यह एक वैध परिवर्तनीय (गैर-स्थिरांक) अंतराल है)। कुछ भाषाओं में, विशेष रूप से गतिशील प्रोग्रामिंग भाषाओं में, किसी चर को मान निर्दिष्ट करने से पहले उसे घोषित करना आवश्यक नहीं होता है। ऐसी भाषाओं में, एक चर को पहली बार असाइन किए जाने पर स्वचालित रूप से घोषित किया जाता है, इसके दायरे को भाषा के अनुसार अलग-अलग घोषित किया जाता है।
एकल असाइनमेंट
कोई भी असाइनमेंट जो किसी मौजूदा मान को बदलता है (उदा। 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 शार्प (प्रोग्रामिंग लैंग्वेज) और जंग (प्रोग्रामिंग भाषा), यहाँ दिखाई गई हैं, जिनमें कोष्ठकों के साथ स्पष्ट टपल निर्माण और विखंडन की आवश्यकता होती है:
<वाक्यविन्यास प्रकाश लैंग = csharp>
// मान्य सी # या जंग सिंटैक्स
(ए, बी) = (बी, ए);
</वाक्यविन्यास हाइलाइट>
<वाक्यविन्यास प्रकाश लैंग = csharp>
// सी # टपल वापसी
(स्ट्रिंग, इंट) f() => (फू, 1);
वर (ए, बी) = च ();
</वाक्यविन्यास हाइलाइट>
<वाक्यविन्यास प्रकाश लैंग = जंग>
// रस्ट टपल रिटर्न चलो एफ = || (फू, 1);
चलो (ए, बी) = एफ ();
</वाक्यविन्यास हाइलाइट>
यह फ़ंक्शन से एकाधिक मान वापस करने के लिए आउटपुट पैरामीटर के उपयोग का विकल्प प्रदान करता है। यह CLU (प्रोग्रामिंग लैंग्वेज) (1974) की तारीख है, और CLU ने समानांतर असाइनमेंट को आम तौर पर लोकप्रिय बनाने में मदद की।
सी # अतिरिक्त रूप से दाहिने हाथ की ओर अभिव्यक्ति द्वारा परिभाषित कार्यान्वयन के साथ सामान्यीकृत डिकंस्ट्रक्शन असाइनमेंट की अनुमति देता है, क्योंकि कंपाइलर अभिव्यक्ति पर उपयुक्त उदाहरण विधि या विस्तार Deconstruct
विधि की खोज करता है, जिसमें वेरिएबल्स को असाइन किए जाने के लिए आउटपुट पैरामीटर होना चाहिए।[19] उदाहरण के लिए, एक ऐसी विधि जो कक्षा (कंप्यूटर प्रोग्रामिंग) को उसी व्यवहार में प्रकट करेगी जो, उपरोक्त f()
के वापसी मूल्य के रूप में होगी
<वाक्यविन्यास प्रकाश लैंग = csharp>
शून्य डिकंस्ट्रक्ट (आउट स्ट्रिंग ए, आउट इंट बी) {ए = फू; बी = 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
शुरुआती प्रोग्रामर कभी-कभी असाइनमेंट को समानता के लिए रिलेशनल ऑपरेटर के साथ असाइनमेंट को भ्रमित करते हैं, जैसा कि = अर्थ गणित में समानता (गणित) है, और कई भाषाओं में असाइनमेंट के लिए उपयोग किया जाता है। लेकिन असाइनमेंट एक चर के मान को बदल देता है, जबकि समानता परीक्षण जाँच करता है कि क्या दो अभिव्यक्ति का मूल्य समान है।
कुछ भाषाओं में, जैसे कि बुनियादी, एक बराबर चिह्न ("="
) का उपयोग असाइनमेंट ऑपरेटर और समानता संबंधपरक ऑपरेटर दोनों के लिए किया जाता है, जिसका अर्थ संदर्भ निर्धारित करना है। अन्य भाषाएं दो ऑपरेटरों के लिए अलग-अलग प्रतीकों का उपयोग करती हैं। उदाहरण के लिए:
- ALGOL और पास्कल (प्रोग्रामिंग लैंग्वेज) में, असाइनमेंट ऑपरेटर एक कोलन और एक बराबर का चिह्न (
":="
) जबकि समानता संकारक एकल बराबर है ("="
). - C (प्रोग्रामिंग लैंग्वेज) में, असाइनमेंट ऑपरेटर एक सिंगल इक्वल साइन (
"="
) जबकि समानता ऑपरेटर बराबर चिह्नों की एक जोड़ी है ("=="
). - R (प्रोग्रामिंग लैंग्वेज) में, असाइनमेंट ऑपरेटर मूल रूप से होता है
<-
, के रूप मेंx <- value
, लेकिन कुछ संदर्भों में एकल बराबर चिह्न का उपयोग किया जा सकता है।
यदि प्रोग्रामर कौन सा फॉर्म भूल जाता है तो दो प्रतीकों में समानता त्रुटियों का कारण बन सकती है (=
,==
,:=
) उपयुक्त है, या गलत प्रकार है=
कब==
इरादा था। यह सी जैसी भाषाओं के साथ एक सामान्य प्रोग्रामिंग समस्या है (लिनक्स कर्नेल के पिछले दरवाजे के एक प्रसिद्ध प्रयास सहित),[22] जहां असाइनमेंट ऑपरेटर असाइन किए गए मान को भी लौटाता है (उसी तरह जैसे फ़ंक्शन एक मान लौटाता है), और वैध रूप से अभिव्यक्तियों के अंदर नेस्टेड किया जा सकता है। यदि आशय एक में दो मूल्यों की तुलना करना था if
बयान, उदाहरण के लिए, एक असाइनमेंट बूलियन सत्य के रूप में व्याख्या करने योग्य मूल्य वापस करने की काफी संभावना है, जिस स्थिति में then
खंड निष्पादित किया जाएगा, जिससे कार्यक्रम अप्रत्याशित रूप से व्यवहार करेगा। कुछ भाषा प्रोसेसर (जैसे जीएनयू कंपाइलर संग्रह) ऐसी स्थितियों का पता लगा सकते हैं, और संभावित त्रुटि के प्रोग्रामर को चेतावनी दे सकते हैं।
नोटेशन
कॉपी करने के असाइनमेंट के लिए दो सबसे आम प्रतिनिधित्व बराबर चिह्न हैं (=
) और कोलन-बराबर (:=
). भाषा और/या उपयोग के आधार पर दोनों रूपों को या तो असाइनमेंट स्टेटमेंट या असाइनमेंट ऑपरेटर (प्रोग्रामिंग) (जिसका मूल्य भी है) को शब्दार्थ रूप से निरूपित किया जा सकता है।
variable = expression
Fortran, PL/I, C (and descendants such as C++, Java, etc.), Bourne shell, Python, Go (assignment to pre-declared variables), R, PowerShell, Nim, etc. variable := expression
ALGOL (and derivatives), Simula, CPL, BCPL, Pascal[23] (and descendants such as Modula), Mary, PL/M, Ada, Smalltalk, Eiffel,[24][25] Oberon, Dylan,[26] Seed7, Python (an assignment expression),[27] Go (shorthand for declaring and defining a variable),[28] Io, AMPL, ML (assigning to a reference value),[29] AutoHotkey etc.
अन्य संभावनाओं में एक बायां तीर या एक कीवर्ड शामिल है, हालांकि अन्य, दुर्लभ, वेरिएंट हैं:
variable << expression
Magik variable <- expression
F#, OCaml, R, S variable <<- expression
R assign("variable", expression)
R variable ← expression
APL,[30] Smalltalk, BASIC Programming variable =: expression
J LET variable = expression
BASIC let variable := expression
XQuery set variable to expression
AppleScript set variable = expression
C shell Set-Variable variable (expression)
PowerShell variable : expression
Macsyma, Maxima, K variable: expression
Rebol var variable expression
mIRC scripting language reference-variable :- reference-expression
Simula
गणितीय स्यूडोकोड # सामान्य गणितीय प्रतीकों के असाइनमेंट को आम तौर पर बाएं-तीर के साथ दर्शाया जाता है।
कुछ प्लेटफ़ॉर्म अभिव्यक्ति को बाईं ओर और चर को दाईं ओर रखते हैं:
MOVE expression TO variable
COBOL expression → variable
TI-BASIC, Casio BASIC expression -> variable
POP-2, BETA, R put expression into variable
LiveCode PUT expression IN variable
ABC
कुछ अभिव्यक्ति-उन्मुख भाषाएँ, जैसे लिस्प (प्रोग्रामिंग भाषा)[31][32] और टीसीएल, समान रूप से असाइनमेंट सहित सभी बयानों के लिए उपसर्ग (या पोस्टफिक्स) सिंटैक्स का उपयोग करें।
(setf variable expression)
Common Lisp (set! variable expression)
Scheme[33][34][35] set variable expression
Tcl expression variable !
Forth
यह भी देखें
- सी ++ में असाइनमेंट ऑपरेटर
- ऑपरेटर (प्रोग्रामिंग)
- नाम बंधन
- एकीकरण (कम्प्यूटिंग)
- अपरिवर्तनीय वस्तु
- कॉन्स्ट-शुद्धता
टिप्पणियाँ
- ↑ 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.