क्या जावा में x ++ और ++ x के बीच अंतर है?


113

क्या जावा में ++ x और x ++ के बीच अंतर है?


53
समान उत्तरों की एक धार का उपयोग करें ...
स्केफमैन

5
... और समान उत्तर पाने के लिए सबसे पहले
उत्थान

9
सबसे जल्दी खराब होने के लिए, सबसे पुराने द्वारा छाँटें, ऊपर क्लिक करें। ohowoho।
बिज्जू जूल

1
मुझे यकीन था कि मेरे पास है! एमिल का जवाब वैसे भी बेहतर है।
विक्टर

जवाबों:


290

++ x को प्रीइंकेरमेंट कहा जाता है जबकि x ++ को पोस्टइनक्रीमेंट कहा जाता है।

int x = 5, y = 5;

System.out.println(++x); // outputs 6
System.out.println(x); // outputs 6

System.out.println(y++); // outputs 5
System.out.println(y); // outputs 6

62
अच्छी व्याख्या, 1 ++। उफ़, ++ 1 :)
नवाफल

67

हाँ

++ x x का मान बढ़ाता है और फिर x
x लौटाता है x का मान लौटाता है और फिर वेतन वृद्धि करता है

उदाहरण:

x=0;
a=++x;
b=x++;

कोड चलाने के बाद a और b दोनों 1 होंगे लेकिन x 2 होगा।


10
+1 बहुत सारे उदाहरण, यह उदाहरणों के साथ एक स्पष्टीकरण है :)
जेरेमी स्माइथ

1
हाँ, मैं भी शुरू में स्पष्ट गद्य स्पष्टीकरण के कारण इस एक को समाप्त कर दिया। (हम्म, पता नहीं आप आजकल टिप्पणियों में घिनौना काम कर सकते हैं ... शांत )
जोनीक

17

इन्हें पोस्टफ़िक्स और प्रीफ़िक्स ऑपरेटर्स के रूप में जाना जाता है। दोनों चर में 1 जोड़ देंगे लेकिन कथन के परिणाम में अंतर है।

int x = 0;
int y = 0;
y = ++x;            // result: y=1, x=1

int x = 0;
int y = 0;
y = x++;            // result: y=0, x=1

यह नहीं होना चाहिए suffix?
हाइपरएन्यूट्रिनो

10

हाँ,

int x=5;
System.out.println(++x);

प्रिंट करेंगे 6और

int x=5;
System.out.println(x++);

छप जाएगा 5


1
@ इसके अलावा, मैं सिर्फ इस बात पर विचार कर रहा था कि अपने वोट कैसे डाले जाएं, इसलिए यहां मेरी व्याख्या है: एमिल एच के जवाब को पसंद करने का एक छोटा कारण यह है कि उनका उदाहरण कोड / थोड़ा / अधिक जानकारीपूर्ण है।
जोनीक

Jonik। यह सच है, इसमें कीवर्ड 'प्रीइंक्रिमेंट' और 'पोस्टइनक्रीमेंट' भी शामिल हैं।
टॉम

यह "उत्तर" आपको एक परीक्षण केस आउटपुट बताता है, और मुझे लगता है कि आउटपुट उत्तर नहीं हैं। इसके विपरीत, कुछ कोड निष्पादन के सामान्य रूप से (अप्रत्याशित) परिणाम प्रश्न के रूप में होता है। इसलिए मेरा डाउन वोट।
अल्बर्टो डे पाओला

8

मैं इसके हालिया डुप्पर में से एक से यहां उतरा , और हालांकि यह प्रश्न उत्तर से अधिक है, मैं कोड को हटाने और "अभी तक एक और जवाब" जोड़ने में मदद नहीं कर सका :-)

सटीक होने के लिए (और शायद, थोड़ा पांडित्य),

int y = 2;
y = y++;

इसमें संकलित है:

int y = 2;
int tmp = y;
y = y+1;
y = tmp;

यदि आप javacइस Y.javaवर्ग:

public class Y {
    public static void main(String []args) {
        int y = 2;
        y = y++;
    }
}

और javap -c Y, आपको निम्नलिखित jvm कोड मिलता है (मैंने जावा वर्चुअल मशीन विनिर्देश की मदद से मुख्य विधि पर टिप्पणी करने की अनुमति दी है ):

public class Y extends java.lang.Object{
public Y();
  Code:
   0:   aload_0
   1:   invokespecial  #1; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[]);
  Code:
   0:   iconst_2 // Push int constant `2` onto the operand stack. 

   1:   istore_1 // Pop the value on top of the operand stack (`2`) and set the
                 // value of the local variable at index `1` (`y`) to this value.

   2:   iload_1  // Push the value (`2`) of the local variable at index `1` (`y`)
                 // onto the operand stack

   3:   iinc  1, 1 // Sign-extend the constant value `1` to an int, and increment
                   // by this amount the local variable at index `1` (`y`)

   6:   istore_1 // Pop the value on top of the operand stack (`2`) and set the
                 // value of the local variable at index `1` (`y`) to this value.
   7:   return

}

इस प्रकार, हमारे पास अंततः है:

0,1: y=2
2: tmp=y
3: y=y+1
6: y=tmp

7

जब कंप्यूटर वास्तव में क्या करता है पर विचार ...

++ x: मेमोरी से एक्स लोड, इंक्रीमेंट, उपयोग, मेमोरी में वापस स्टोर करें।

x ++: मेमोरी से x लोड करें, उपयोग करें, इंक्रीमेंट करें, मेमोरी में वापस स्टोर करें।

विचार करें: a = 0 x = f (a ++) y = f (++ a)

जहाँ फ़ंक्शन f (p) रिटर्न p + 1 है

x 1 (या 2) होगा

y 2 होगा (या 1)

और उसी में समस्या है। संकलक के लेखक ने पुनर्प्राप्ति के बाद, उपयोग के बाद, या भंडारण के बाद पैरामीटर पारित किया।

आम तौर पर, बस x = x + का उपयोग करें। यह सरल तरीका है।


5

जावा में x ++ और ++ x के बीच अंतर है

++ x एक उपसर्ग रूप है: यह चर अभिव्यक्ति को बढ़ाता है और फिर अभिव्यक्ति में नए मूल्य का उपयोग करता है।

उदाहरण के लिए यदि कोड में उपयोग किया जाता है:

int x = 3;

int y = ++x;
//Using ++x in the above is a two step operation.
//The first operation is to increment x, so x = 1 + 3 = 4
//The second operation is y = x so y = 4

System.out.println(y); //It will print out '4'
System.out.println(x); //It will print out '4'

x ++ एक उपसर्ग रूप है: चर मान का उपयोग पहले अभिव्यक्ति में किया जाता है और फिर ऑपरेशन के बाद इसे बढ़ाया जाता है।

उदाहरण के लिए यदि कोड में उपयोग किया जाता है:

int x = 3;

int y = x++;
//Using x++ in the above is a two step operation.
//The first operation is y = x so y = 3
//The second operation is to increment x, so x = 1 + 3 = 4

System.out.println(y); //It will print out '3'
System.out.println(x); //It will print out '4' 

आशा है कि यह स्पष्ट है। उपरोक्त कोड के साथ चलना और खेलना आपकी समझ में मदद करना चाहिए।


3

हाँ।

public class IncrementTest extends TestCase {

    public void testPreIncrement() throws Exception {
        int i = 0;
        int j = i++;
        assertEquals(0, j);
        assertEquals(1, i);
    }

    public void testPostIncrement() throws Exception {
        int i = 0;
        int j = ++i;
        assertEquals(1, j);
        assertEquals(1, i);
    }
}

2

हाँ, ++ X, X + 1 का उपयोग अभिव्यक्ति में किया जाएगा। एक्स ++ का उपयोग करते हुए एक्स का उपयोग अभिव्यक्ति में किया जाएगा और एक्स का उपयोग केवल अभिव्यक्ति के मूल्यांकन के बाद बढ़ाया जाएगा।

तो अगर X = 9, ++ X का उपयोग करते हुए, मान 10 का उपयोग किया जाएगा, अन्यथा, मान 9।


2

यदि यह कई अन्य भाषाओं की तरह है, तो आप एक सरल कोशिश करना चाहते हैं:

i = 0;
if (0 == i++) // if true, increment happened after equality check
if (2 == ++i) // if true, increment happened before equality check

यदि ऊपर ऐसा नहीं होता है, तो वे समकक्ष हो सकते हैं


2

हां, वापस लौटाया गया मूल्य क्रमशः वृद्धि के बाद और पहले मूल्य है।

class Foo {
    public static void main(String args[]) {
        int x = 1;
        int a = x++;
        System.out.println("a is now " + a);
        x = 1;
        a = ++x;
        System.out.println("a is now " + a);
    }
}

$ java Foo
a is now 1
a is now 2

1

ठीक है, मैं यहां उतरा क्योंकि मैं हाल ही में क्लासिक स्टैक कार्यान्वयन की जांच करते समय एक ही मुद्दे पर आया था। बस एक अनुस्मारक है कि यह स्टैक के सरणी आधारित कार्यान्वयन में उपयोग किया जाता है, जो कि लिंक-लिस्ट एक की तुलना में थोड़ा तेज है।

नीचे दिए गए कोड, पुश और पॉप की जांच करें।

public class FixedCapacityStackOfStrings
{
  private String[] s;
  private int N=0;

  public FixedCapacityStackOfStrings(int capacity)
  { s = new String[capacity];}

  public boolean isEmpty()
  { return N == 0;}

  public void push(String item)
  { s[N++] = item; }

  public String pop()
  { 
    String item = s[--N];
    s[N] = null;
    return item;
  }
}

1

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

public static void main(String args[])
{
    int i , j , k = 0;
    j = k++; // Value of j is 0
    i = ++j; // Value of i becomes 1
    k = i++; // Value of k is 1
    System.out.println(k);  
}

1

प्रश्न पहले से ही उत्तर दिया गया है, लेकिन मुझे अपनी तरफ से भी जोड़ने की अनुमति है।

सबसे पहले ++ का मतलब होता है एक से बढ़ाना और - का मतलब होता है एक से बढ़ाना ।

अब x ++ का अर्थ है इस रेखा के बाद Increment x और इस रेखा से पहले ++ x का अर्थ है Increment x

इस उदाहरण की जाँच करें

class Example {
public static void main (String args[]) {
      int x=17,a,b;
      a=x++;
      b=++x;
      System.out.println(“x=” + x +“a=” +a);
      System.out.println(“x=” + x + b=” +b);
      a = x--;
      b = --x;
      System.out.println(“x=” + x + a=” +a);
      System.out.println(“x=” + x + b=” +b);
      }
}

यह निम्नलिखित आउटपुट देगा:

x=19 a=17
x=19 b=19
x=18 a=19
x=17 b=17

1
स्पष्टीकरण के कुछ शब्दों के साथ यह प्रतिक्रिया और भी बेहतर होगी।
Thom

0

I ++ के साथ, इसे पोस्टइन्क्रिमेंट कहा जाता है, और मूल्य का उपयोग उस संदर्भ में किया जाता है, जो तब बढ़ा हुआ होता है; ++ i प्रीइंकेरिमेंट पहले मूल्य बढ़ाता है और फिर इसे संदर्भ में उपयोग करता है।

यदि आप इसे किसी भी संदर्भ में उपयोग नहीं कर रहे हैं, तो इससे कोई फर्क नहीं पड़ता कि आप क्या उपयोग करते हैं, लेकिन कन्वेंशन द्वारा पोस्टिंक्रेमेंट का उपयोग किया जाता है।


0

एक बहुत बड़ा अंतर है।

जैसा कि अधिकांश उत्तरों ने पहले ही सिद्धांत को इंगित किया है, मैं एक आसान उदाहरण बताना चाहूंगा:

int x = 1;
//would print 1 as first statement will x = x and then x will increase
int x = x++;
System.out.println(x);

अब देखते हैं ++x:

int x = 1;
//would print 2 as first statement will increment x and then x will be stored
int x = ++x;
System.out.println(x);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.