जावा में पोस्ट इंक्रीमेंट (i ++) और प्री इंक्रीमेंट (++ i) ऑपरेटर कैसे काम करते हैं?


99

क्या आप मुझे इस जावा कोड का आउटपुट समझा सकते हैं?

int a=5,i;

i=++a + ++a + a++;
i=a++ + ++a + ++a;
a=++a + ++a + a++;

System.out.println(a);
System.out.println(i);

आउटपुट दोनों मामलों में 20 है


9
हमेशा अस्पष्ट बयानों से बचें :)
प्रसून सौरव

9
@Prasoon सौरव C और C ++ के विपरीत, Java और C # ने कड़ाई से मूल्यांकन के क्रम को परिभाषित किया है, इसलिए ये कथन अस्पष्ट नहीं हैं।
पीट किरखम

12
मुझे पता है कि लेकिन अभी भी वे कथन व्यावहारिक उद्देश्य के लिए इस्तेमाल नहीं किए जा सकते (नहीं हो सकते) इसलिए इससे बचना चाहिए।
प्रसून सौरव


4
@PeteKirkham यह छह साल बाद खत्म हो गया है, लेकिन मैं अभी भी इंगित करना चाहता हूं कि "अस्पष्ट", इस स्थिति में, अस्पष्ट है - इसका मतलब हो सकता है "संकलक को पता नहीं है कि क्या रखा जाए", या इसका मतलब हो सकता है "प्रोग्रामर इसका कोई मतलब नहीं है "।
निधि मोनिका का मुकदमा

जवाबों:


150

क्या यह मदद करता है?

a = 5;
i=++a + ++a + a++; =>
i=6 + 7 + 7; (a=8)

a = 5;
i=a++ + ++a + ++a; =>
i=5 + 7 + 8; (a=8)

मुख्य बिंदु यह है कि ++aमूल्य बढ़ाता है और तुरंत इसे वापस करता है।

a++ मान भी बढ़ाता है (पृष्ठभूमि में) लेकिन चर का अपरिवर्तित मूल्य लौटाता है - ऐसा लगता है कि यह बाद में निष्पादित होता है।


5
क्या आप दूसरे में == 9 निश्चित हैं?
पीट किरखम

1
i = ++ a + ++ a + a ++; => i = 7 + 8 + 5; (a = 8) चूंकि पोस्ट इन्क्रीमेंट में सबसे अधिक पूर्वता होती है, क्या ++ को पहले निष्पादित किया जाता है?
rsirs

2
जटिल उदाहरण के लिए कुछ है कि समझाने के लिए आसान है।
ओज़्नस

क्या यह उत्तर c # और c ++ के लिए समान है?
वर्कओवरफ्लो

यहाँ A, b, और c बराबर 2 क्यों है? int a = 1; int b = a++; int c = ++b;बी होने की उम्मीद कर रहा था क्योंकि यह पोस्ट वेतन वृद्धि है।
डेनिस

202

++aवेतन वृद्धि और फिर चर का उपयोग करता है।
a++उपयोग करता है और फिर चर को बढ़ाता है।

यदि आपके पास है

a = 1;

और आप करते हैं

System.out.println(a++); //You will see 1

//Now a is 2

System.out.println(++a); //You will see 3

कोडैडक्ट आपके विशेष स्निपेट की व्याख्या करता है


62

दोनों मामलों में यह पहले मूल्य की गणना करता है, लेकिन वेतन वृद्धि के बाद यह पुराना मूल्य रखता है और रिटर्न की गणना के बाद

++ एक

  1. a = a + 1;
  2. एक वापसी;

एक ++

  1. temp = a;
  2. a = a + 1;
  3. वापसी अस्थायी;

8
सबसे स्पष्ट उत्तर
कार्तिक चुघ

2
यह वह था जिसने मुझे स्पष्ट रूप से समझा .. धन्यवाद।
रेमतनारब

22
i = ++a + ++a + a++;

है

i = 6 + 7 + 7

कार्य करना : 6 से बढ़ाना (वर्तमान मान 6) + 7 से बढ़ाना (वर्तमान मान 7)। Sum 13 है अब इसे (= 7) के वर्तमान मूल्य में जोड़ें और फिर 8 से वृद्धि करें। योग 20 है और असाइनमेंट पूरा होने के बाद का मूल्य 8 है।

i = a++ + ++a + ++a;

है

i = 5 + 7 + 8

कार्य करना : a के आरंभिक मूल्य पर 5. इसके अतिरिक्त का उपयोग करें और फिर इसे 6 तक बढ़ाएँ (वर्तमान मान 6)। + के अन्य संचालक प्राप्त करने के लिए वर्तमान मूल्य 6 से 7 तक की वृद्धि। Sum 12 है और a का वर्तमान मान है। 7 से 8 तक अगला वेतन वृद्धि (वर्तमान मान = 8) और इसे 20 प्राप्त करने के लिए पिछली राशि 12 में जोड़ें।


ये कथन दाएं से बाएं या बाएं से दाएं काम करते हैं?
अभिजीत

10

++aaमूल्यांकन से पहले वेतन वृद्धि । a++मूल्यांकन करता है aऔर फिर इसे बढ़ाता है।

आपकी दी गई अभिव्यक्ति से संबंधित:

i = ((++a) + (++a) + (a++)) == ((6) + (7) + (7)); // a is 8 at the end
i = ((a++) + (++a) + (++a)) == ((5) + (7) + (8)); // a is 8 at the end

जिन माता-पिता का मैंने ऊपर उपयोग किया है, वे जावा द्वारा अंतर्निहित रूप से उपयोग किए जाते हैं। यदि आप शर्तों को इस तरह से देखते हैं तो आप आसानी से देख सकते हैं, कि वे दोनों एक ही हैं जैसे वे प्रशंसनीय हैं।


1
@ KlasLindbäck कम्यूटेटिव का मतलब है कि आप दोनों अभिव्यक्तियों को स्वैप कर सकते हैं और अभी भी एक ही परिणाम प्राप्त कर सकते हैं। तो एक ++ + ++ a == ++ a + (a + 5 + 7 == 6 + 6; a == 7 आखिर में)।
आउर

8

उपरोक्त उदाहरण में

int a = 5,i;

i=++a + ++a + a++;        //Ans: i = 6 + 7 + 7 = 20 then a = 8 

i=a++ + ++a + ++a;        //Ans: i = 8 + 10 + 11 = 29 then a = 11

a=++a + ++a + a++;        //Ans: a = 12 + 13 + 13 = 38

System.out.println(a);    //Ans: a = 38

System.out.println(i);    //Ans: i = 29

4

++ ए उपसर्ग वृद्धि वेतन ऑपरेटर है:

  • परिणाम की गणना की और पहले संग्रहीत किया जाता है,
  • तब चर का उपयोग किया जाता है।

a ++ पोस्टफ़िक्स इन्क्रीमेंट ऑपरेटर है:

  • चर का उपयोग पहले किया जाता है,
  • फिर परिणाम की गणना और संग्रहीत किया जाता है।

एक बार जब आप नियमों को याद करते हैं, तो सब कुछ की गणना करने के लिए ईज़ी!


4

मान लिया कि आप का मतलब है

int a=5; int i;

i=++a + ++a + a++;

System.out.println(i);

a=5;

i=a++ + ++a + ++a;

System.out.println(i);

a=5;

a=++a + ++a + a++;

System.out.println(a);

यह मूल्यांकन करता है:

i = (6, a is now 6) + (7, a is now 7) + (7, a is now 8)

इसलिए i 6 + 7 + 7 = 20 है और इसलिए 20 मुद्रित है।

i = (5, a is now 6) + (7, a is now 7) + (8, a is now 8)

इसलिए मैं 5 + 7 + 8 = 20 है और इसलिए 20 फिर से छपा है।

a = (6, a is now 6) + (7, a is now 7) + (7, a is now 8)

और दाहिने हाथ की ओर से मूल्यांकन किए जाने के बाद (8 से 8 सेट करने सहित) को 6 + 7 + 7 = 20 पर सेट किया जाता है और इसलिए 20 को अंतिम समय में प्रिंट किया जाता है।


3

जब a5 है, तब a++अभिव्यक्ति को 5 और aबाद में वेतन वृद्धि देता है , जबकि संख्या को अभिव्यक्ति को पास करने से पहले ++aबढ़ाता है a(जो aइस मामले में अभिव्यक्ति को 6 देता है )।

तो आप हिसाब लगा लीजिए

i = 6 + 7 + 7
i = 5 + 7 + 8

3

मेरा मानना ​​है कि यदि आप अपने सभी बयानों को जोड़ते हैं और इसे जावा 8.1 में चलाते हैं तो आपको एक अलग उत्तर मिलेगा, कम से कम मेरा अनुभव तो यही कहता है।

कोड इस तरह काम करेगा:

int a=5,i;

i=++a + ++a + a++;            /*a = 5;
                                i=++a + ++a + a++; =>
                                i=6 + 7 + 7; (a=8); i=20;*/

i=a++ + ++a + ++a;           /*a = 5;
                                i=a++ + ++a + ++a; =>
                                i=8 + 10 + 11; (a=11); i=29;*/

a=++a + ++a + a++;            /*a=5;
                                a=++a + ++a + a++; =>
                                a=12 + 13 + 13;  a=38;*/

System.out.println(a);        //output: 38
System.out.println(i);         //output: 29

3

प्री-इंक्रीमेंट का मतलब है कि वेरिएबल को पहले से इंप्रूव किया गया है क्योंकि इसका एक्सप्रेशन में मूल्यांकन किया गया है। पोस्ट-इन्क्रीमेंट का मतलब है कि वेरिएबल बढ़ा हुआ है, इसे अभिव्यक्ति में उपयोग के लिए मूल्यांकन किया गया है।

इसलिए, ध्यान से देखें और आप देखेंगे कि तीनों असाइनमेंट अंकगणितीय रूप से समतुल्य हैं।


2

प्री-इंक्रीमेंट और पोस्ट इंक्रीमेंट एक एक्सप्रेशन में न होने के बराबर है

int j =0;
int r=0         
for(int v = 0; v<10; ++v) { 
          ++r;
          j++;
          System.out.println(j+" "+r);
  }  
 1 1  
 2 2  
 3 3       
 4 4
 5 5
 6 6
 7 7
 8 8
 9 9
10 10

0
a=5; i=++a + ++a + a++;

है

i = 7 + 6 + 7

कार्य करना: पूर्व / पोस्ट वेतन वृद्धि में "राइट टू लेफ्ट" एसोसिएटिविटी है, और प्री पोस्ट पर पूर्ववर्तीता है, इसलिए सबसे पहले पूर्व वेतन वृद्धि को हल किया जाएगा (++a + ++a) => 7 + 6। फिर a=7वेतन वृद्धि => 7 + 6 + 7 =20और पोस्ट करने के लिए प्रदान की जाती है a =8

a=5; i=a++ + ++a + ++a;

है

i=7 + 7 + 6

कार्य करना: पूर्व / पोस्ट वेतन वृद्धि में "बाएं से दाएं" संबद्धता है, और पूर्व में पोस्ट पर पूर्ववर्तीता है, इसलिए सबसे पहले पूर्व वेतन वृद्धि को हल किया जाएगा। (++a + ++a) => 7 + 6फिर a=7पोस्ट वेतन वृद्धि => 7 + 7 + 6 =20और प्रदान की जाती है a =8


0

मेरा मानना ​​है कि आप इन सभी कथनों को अलग-अलग
अंजाम दे रहे हैं, एक साथ क्रियान्वित करेंगे => 38, 29

int a=5,i;
i=++a + ++a + a++;
//this means i= 6+7+7=20 and when this result is stored in i,
//then last *a* will be incremented <br>
i=a++ + ++a + ++a;
//this means i= 5+7+8=20 (this could be complicated, 
//but its working like this),<br>
a=++a + ++a + a++;
//as a is 6+7+7=20 (this is incremented like this)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.