इंक्रीमेंट और डिक्रीमेंट ऑपरेटर

From Vigyanwiki

इंक्रीमेंट और डिक्रीमेंट ऑपरेटर एकल ऑपरेटर (प्रोग्रामिंग) हैं जो अपने ओपेरंड को एक से बढ़ाते या घटाते हैं।

वे सामान्य रूप से अनिवार्य प्रोग्रामिंग प्रोग्रामिंग भाषाओं में पाए जाते हैं। C (प्रोग्रामिंग भाषा) जैसी भाषाओं में प्रत्येक ऑपरेटर के दो संस्करण (प्री- और पोस्ट-) आंशिक रूप से अलग सिमेंटिक के साथ होते हैं।

B (C और इसके विभिन्न अवकल सहित) से सिंटैक्टिक रूप से प्राप्त भाषाओं में, इंक्रीमेंट ऑपरेटर को ++ के रूप में लिखा जाता है और डिक्रीमेंट ऑपरेटर को -- कई अन्य भाषाएँ inc(x) और dec(x) फ़ंक्शन का उपयोग करती हैं।

इंक्रीमेंट ऑपरेटर बढ़ता है, और डिक्रीमेंट ऑपरेटर घटता है, इसके ऑपरेंड का मान 1 ऑपरेंड में एक अंकगणितीय या सूचक (कंप्यूटर प्रोग्रामिंग) डेटा टाइप होना चाहिए, और परिवर्तनीय डेटा ऑब्जेक्ट को संदर्भित करना चाहिए। पॉइंटर्स मान एक राशि से बढ़ा (या घटाया) हो जाता है जो उन्हें मेमोरी में समीपवर्ती (या पूर्व) तत्व को प्रदर्शित करता है।

उन भाषाओं में जो ऑपरेटरों के दोनों संस्करणों का समर्थन करती हैं:

  • प्री-इन्क्रीमेंट और प्री-डिक्रीमेंट ऑपरेटर्स अपने ऑपरेंड को 1 से बढ़ाते (या घटाते) हैं, और एक्सप्रेशन का मान परिणामी इंक्रीमेंटेड (या डिक्रीमेंट) मान होता है।
  • पोस्ट-इंक्रीमेंट और पोस्ट-डिक्रीमेंट ऑपरेटर अपने ऑपरेंड के मान को 1 से बढ़ाते (या घटाते) हैं, लेकिन एक्सप्रेशन का मान इंक्रीमेंट (या डिक्रीमेंट) संक्रिया से पहले ऑपरेंड का मान होता है।

उन भाषाओं में जहां इंक्रीमेंट/डिक्रीमेंट एक एक्सप्रेशन नहीं है (उदाहरण के लिए, गो (प्रोग्रामिंग भाषा)), केवल गो, पोस्ट ऑपरेटरों के स्थिति में केवल एक संस्करण की आवश्यकता है।

चूंकि इंक्रीमेंट/डिक्रीमेंट ऑपरेटर अपने ऑपरेंड को संशोधित करता है, ऐसे ऑपरेंड का समान एक्सप्रेशन के अंदर एक से अधिक बार उपयोग अपरिभाषित परिणाम उत्पन्न कर सकता है। उदाहरण के लिए, x - ++x जैसे एक्सप्रेशन में, यह स्पष्ट नहीं है कि किस क्रम में सब्ट्रेक्शन और इंक्रीमेंट संक्रिया किया जाना चाहिए। ऐसे एक्सप्रेशन सामान्य रूप से अपरिभाषित व्यवहार का उपयोग करती हैं, और इससे संरक्षण किया जाना चाहिए।

C जैसे टाइप किए गए पॉइंटर्स वाली भाषाओं में,इंक्रीमेंट ऑपरेटर पॉइंटर को उस प्रकार के अगले आइटम पर ले जाता है - उस प्रकार के आकार से पॉइंटर के मान को बढ़ाता है। जब एक सूचक (सही प्रकार का) किसी सरणी में किसी आइटम को इंगित करता है, तो इंक्रीमेंट (या डिक्रीमेंट) सूचक को उस सरणी के अगले (या पूर्व) आइटम पर इंगित करता है। इस प्रकार, एक सूचक को एक पूर्णांक में बढ़ाना इसे अगले पूर्णांक की ओर इंगित करता है सामान्य रूप से सूचक मान को 4 से बढ़ाता है;[1] 106 बाइट्स के आकार की संरचना में एक पॉइंटर को बढ़ाने से यह पॉइंटर मान को 106 तक बढ़ाकर अगली संरचना की ओर संकेत करता है।[2]


उदाहरण

निम्नलिखित C कोड खंड प्री और पोस्ट इंक्रीमेंट और डिक्रीमेंट ऑपरेटरों के बीच अंतर को दर्शाता है:

int x;
int y;

// Increment operators
// Pre-increment: x is incremented by 1, then y is assigned the value of x
x = 1;
y = ++x;    // x is now 2, y is also 2

// Post-increment: y is assigned the value of x, then x is incremented by 1
x = 1;
y = x++;    // y is 1, x is now 2

// Decrement operators
// Pre-decrement: x is decremented by 1, then y is assigned the value of x
x = 1;
y = --x;    // x is now 0, y is also 0

// Post-decrement: y is assigned the value of x, then x is decremented by 1
x = 1;
y = x--;    // y is 1, x is now 0

इन ऑपरेटरों की डिक्रीमेंट वाली भाषाओं में, समकक्ष परिणामों के लिए कोड की एक अतिरिक्त लाइन की आवश्यकता होती है:

# Pre-increment: y = ++x
x = 1
x = x + 1  # x is now 2  (can be written as "x += 1" in Python)
y = x      # y is also 2

# Post-increment: y = x++
x = 1
y = x      # y is 1
x = x + 1  # x is now 2

पोस्ट-इंक्रीमेंट ऑपरेटर सामान्य रूप से सरणी डेटा संरचना सबस्क्रिप्ट के साथ उपयोग किया जाता है। उदाहरण के लिए:

// Sum the elements of an array
float sum_elements(float arr[], int n)
{
    float  sum = 0.0;
    int    i   =   0;

    while (i < n)
        sum += arr[i++];    // Post-increment of i, which steps
                            //  through n elements of the array
    return sum;
}

पोस्ट-इन्क्रीमेंट ऑपरेटर का उपयोग सामान्य रूप से पॉइंटर (कंप्यूटर प्रोग्रामिंग) के साथ भी किया जाता है:

// Copy one array to another
void copy_array(float *src, float *dst, int n)
{
    while (n-- > 0)        // Loop that counts down from n to zero
        *dst++ = *src++;   // Copies element *(src) to *(dst),
                           //  then increments both pointers
}

ध्यान दें कि ये उदाहरण अन्य C-जैसी भाषाओं जैसे C++ (प्रोग्रामिंग भाषा), जावा (प्रोग्रामिंग भाषा), और C# (प्रोग्रामिंग भाषा) में भी कार्य करते हैं।

  • इंक्रीमेंट ऑपरेटर को एक उदाहरण द्वारा प्रदर्शित किया जा सकता है:
    #include <stdio.h>
    int main()
    {
        int c = 2;
        printf("%d\n", c++); // this statement displays 2, then c is incremented by 1 to 3.
        printf("%d", ++c);   // this statement increments c by 1, then c is displayed.
        return 0;
    }
    
    • आउटपुट:
      2
      4
      


सहायक भाषाएँ

निम्नलिखित सूची, हालांकि पूर्ण या सर्व-समावेशी नहीं है, कुछ प्रमुख प्रोग्रामिंग भाषाओं को सूचीबद्ध करती है जो ++/-- इंक्रीमेंट/डिक्रीमेंट ऑपरेटरों का समर्थन करती हैं।

(ऐप्पल की स्विफ्ट (प्रोग्रामिंग भाषा) ने एक बार इन ऑपरेटरों का समर्थन किया था,[12] लेकिन समर्थन संस्करण 3 के रूप में हटा दिया गया था।)

पास्कल (प्रोग्रामिंग भाषा),डेल्फी (प्रोग्रामिंग भाषा),मॉड्यूल-2, और ओबेरॉन (प्रोग्रामिंग भाषा) समान कार्य प्रदान करते हैं, लेकिन उन्हें inc(x) और dec(x) कहा जाता है।

विशेष रूप से पायथन (प्रोग्रामिंग भाषा) और आरयूएसटी (प्रोग्रामिंग भाषा) इन ऑपरेटरों का समर्थन नहीं करते हैं।

इतिहास

अवधारणा को केन थॉम्पसन द्वारा 1969 के आसपास B (प्रोग्रामिंग भाषा) में प्रस्तुत किया गया था।[13]

थॉम्पसन ++ और -- ऑपरेटरों का आविष्कार करके एक चरण आगे बढ़ गया, जो इंक्रीमेंट या डिक्रीमेंट करता है; उनके प्रीफिक्स या पोस्टफिक्स की स्थिति यह निर्धारित करती है कि परिवर्तन ऑपरेंड के मान को नोट करने से पहले या बाद में होता है या नहीं है। वे B के प्रारम्भिक संस्करणों में नहीं थे, लेकिन पथ में प्रदर्शित हुए। लोग प्रायः अनुमान लगाते हैं कि उन्हें डीईसी पीडीपी-11 द्वारा प्रदान किए गए ऑटो-इन्क्रीमेंट और ऑटो-डिक्रीमेंट एड्रेस मोड का उपयोग करने के लिए बनाया गया था, जिस पर C और यूनिक्स पहली बार लोकप्रिय हुए थे। यह ऐतिहासिक रूप से असंभव है, क्योंकि जब B विकसित किया गया था तब कोई पीडीपी-11 नहीं था। हालाँकि, पीडीपी-7 में कुछ 'स्व-इन्क्रीमेंट' मेमोरी सेल्स थे, इस गुण के साथ कि उनके माध्यम से एक अप्रत्यक्ष मेमोरी संदर्भ ने सेल को बढ़ा दिया। इस सुविधा ने संभव्यता थॉम्पसन को ऐसे ऑपरेटरों का सुझाव दिया था; उन्हें प्रीफिक्स या पोस्टफिक्स दोनों बनाने का सामान्यीकरण उनका अपना था। वास्तव मे, स्व-इन्क्रीमेंट सेल का उपयोग प्रत्यक्ष ऑपरेटरों के कार्यान्वयन में नहीं किया गया था, और नवप्रवर्तन के लिए एक प्रबल प्रयोजन संभव्यता उनका अवलोकन था कि ++x का स्थानांतरण x=x+1 की तुलना मे छोटा था।

यह भी देखें

संदर्भ

  1. Richard M Reese. "Understanding and Using C Pointers". "Chapter 4. Pointers and Arrays". O'Reilly Media, Inc. 2013. ISBN 9781449344184
  2. Richard Petersen. "Introductory C with C++". 2019. Figure 12-12.
  3. "GNU Awk की उपयोगकर्ता मार्गदर्शिका". Free Software Foundation.
  4. "8.3. The Double-Parentheses Construct". The Linux Documentation Project.
  5. Ritchie, Brian W. Kernighan; Dennis M.; Ritchie, Dennis (1988). सी प्रोग्रामिंग भाषा (2. ed., [Nachdr.] ed.). Englewood Cliffs, N.J.: Prentice Hall. p. 18. ISBN 0-13-110362-8.{{cite book}}: CS1 maint: multiple names: authors list (link)
  6. "Increment/decrement operators". cppreference.com.
  7. "++ ऑपरेटर (सी # संदर्भ)". Microsoft Developer Network.
  8. "ऑपरेटर ओवरलोडिंग". dlang.org.
  9. "जीपी ऑपरेटर और उनकी प्राथमिकताएं".
  10. "असाइनमेंट ऑपरेटरों के बारे में".
  11. "इंक्रीमेंट वोल्फ्राम भाषा सिंबल". Wolfram Language Documentation Center.
  12. "बेसिक ऑपरेटर्स". developer.apple.com.
  13. Ritchie, Dennis M. (March 1993). "सी भाषा का विकास". ACM SIGPLAN Notices. 28 (3): 5. doi:10.1145/155360.155580.