มีความแตกต่างระหว่าง x ++ และ ++ x ใน java หรือไม่?


113

มีความแตกต่างระหว่าง ++ x และ x ++ ใน java หรือไม่?


53
จัดเตรียมคำตอบที่เหมือนกัน ...
skaffman

5
... และโหวตคำตอบแรกที่เหมือนกันที่จะได้รับใน ...
skaffman

9
ไปที่สปอยล์อย่างรวดเร็วที่สุดเรียงตามเก่าที่สุดคลิกโหวตเพิ่ม ohowoho
dotjoe

1
ฉันมั่นใจว่าฉันมีมัน! คำตอบของ Emil ดีกว่าอยู่แล้ว
วิกเตอร์

คำตอบ:


290

++ x เรียกว่า preincrement ในขณะที่ x ++ เรียกว่า postincrement

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 :)
nawfal

67

ใช่

++ x เพิ่มค่าของ x แล้วคืนค่า x
x ++ ส่งคืนค่า x แล้วเพิ่มขึ้น

ตัวอย่าง:

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

หลังจากรันโค้ดแล้วทั้ง a และ b จะเป็น 1 แต่ x จะเป็น 2


10
+1 ตัวอย่างมากมายนี่คือคำอธิบายพร้อมตัวอย่าง :)
Jeremy Smyth

1
ใช่ฉันลงเอยด้วยการโหวตเรื่องนี้เนื่องจากคำอธิบายร้อยแก้วที่ชัดเจนในตอนเริ่มต้น (อืมไม่ทราบว่าคุณสามารถเล่นหางได้ในความคิดเห็นสมัยนี้ ... เจ๋ง )
Jonik

17

สิ่งเหล่านี้เรียกว่า postfix และตัวดำเนินการคำนำหน้า ทั้งสองจะเพิ่ม 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หรือไม่?
HyperNeutrino

10

ใช่,

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

จะพิมพ์6และ

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

5จะพิมพ์


1
@ ทอมฉันแค่พิจารณาวิธีการลงคะแนนดังนั้นนี่คือการตีความของฉัน: เหตุผลเล็ก ๆ อย่างหนึ่งที่ชอบคำตอบของ Emil H คือรหัสตัวอย่างของเขา / เล็กน้อย / ให้ข้อมูลมากกว่า
Jonik

Jonik จริงยังรวมถึงคำหลัก 'preincrement' และ 'postincrement'
ทอม

"คำตอบ" นี้เพียงแค่บอกผลลัพธ์กรณีทดสอบและฉันคิดว่าผลลัพธ์ไม่ใช่คำตอบ ในทางตรงกันข้ามโดยปกติผลลัพธ์ (ที่ไม่คาดคิด) ของการเรียกใช้โค้ดบางอย่างจะนำไปสู่คำถาม ดังนั้นการลงคะแนนของฉัน
Alberto de Paola

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 ต่อไปนี้ (ฉันอนุญาตให้ฉันแสดงความคิดเห็นเกี่ยวกับวิธีการหลักด้วยความช่วยเหลือของJava Virtual Machine Specification ):

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 ++: โหลด x จากหน่วยความจำใช้เพิ่มเก็บกลับไปที่หน่วยความจำ

พิจารณา: a = 0 x = f (a ++) y = f (++ a)

โดยที่ฟังก์ชัน f (p) ส่งกลับ p + 1

x จะเป็น 1 (หรือ 2)

y จะเป็น 2 (หรือ 1)

และในนั้นปัญหาก็คือ ผู้เขียนคอมไพเลอร์ส่งผ่านพารามิเตอร์หลังการเรียกข้อมูลหลังการใช้งานหรือหลังการจัดเก็บ

โดยทั่วไปให้ใช้ x = x + 1 วิธีนี้ง่ายกว่า


5

ใน Java มีความแตกต่างระหว่าง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 ++ เป็นรูปแบบ postfix: ค่าตัวแปรจะถูกใช้ก่อนในนิพจน์จากนั้นจะเพิ่มขึ้นหลังจากการดำเนินการ

ตัวอย่างเช่นหากใช้ในโค้ด:

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' 

หวังว่านี่จะชัดเจน การเรียกใช้และเล่นกับโค้ดด้านบนจะช่วยให้คุณเข้าใจ



2

ใช่การใช้ ++ X, X + 1 จะถูกใช้ในนิพจน์ การใช้ X ++ จะใช้ X ในนิพจน์และ X จะเพิ่มขึ้นหลังจากที่นิพจน์ได้รับการประเมินแล้วเท่านั้น

ดังนั้นถ้า 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

ตกลงฉันมาที่นี่เพราะฉันเพิ่งเจอปัญหาเดียวกันเมื่อตรวจสอบการใช้งานสแต็กแบบคลาสสิก ขอเตือนว่าสิ่งนี้ถูกใช้ในการใช้งาน Stack ตามอาร์เรย์ซึ่งเร็วกว่ารายการที่เชื่อมโยงเล็กน้อย

รหัสด้านล่างตรวจสอบปุ่มกดและป๊อปฟังก์ชั่น

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

ใช่มีความแตกต่างในกรณีของ x ++ (postincrement) ค่าของ x จะถูกใช้ในนิพจน์และ x จะเพิ่มขึ้นทีละ 1 หลังจากที่นิพจน์ได้รับการประเมินในทางกลับกัน ++ x (preincrement), x + 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
คำตอบนี้จะดียิ่งขึ้นหากมาพร้อมกับคำอธิบายสองสามคำ
ทม

0

ด้วย i ++ เรียกว่า postincrement และค่าจะถูกใช้ในบริบทใดก็ตามที่เพิ่มขึ้น ++ i คือการเพิ่มค่าล่วงหน้าก่อนแล้วจึงใช้ในบริบท

หากคุณไม่ได้ใช้มันในบริบทใด ๆ ก็ไม่สำคัญว่าคุณจะใช้อะไร แต่อนุสัญญาจะใช้ postincrement


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);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.