Java中的x ++和++ x之间有区别吗?


Answers:


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

67

++ x将x的值递增,然后返回x
x ++返回x的值,然后递增

例:

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

运行代码后,a和b均为1,但x为2。


10
+1很多例子,这是例子的解释 :)
杰里米·史密斯

1
是的,由于一开始就清楚地散文说明,我也最终反对这一观点。(嗯,现在不知道您可以在评论中做草书…… 很酷
Jonik,2009年

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吗?
HyperNeutrino

10

是,

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

将打印6

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

将打印5


1
@Tom,我只是在考虑如何投票,所以这是我的解释:偏爱Emil H答案的一个小原因是他的示例代码/略多/更具信息性。
约尼克,

琼尼克 是的,还包括关键字“ preincrement”和“ postincrement”。
汤姆

这个“答案”只是告诉您一个测试用例的输出,我认为输出不是答案。相反,通常,某些代码执行的(意外)结果导致了该问题。因此,我投了反对票。
Alberto de Paola 2012年

8

我从最近的一个dup上降落到这里,尽管这个问题已得到解答,但我还是忍不住反编译代码并添加了“另一个答案” :-)

为了准确起见(可能有点古怪),

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虚拟机规范,我已允许我注释主要方法):

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 ++是一种后缀形式: 变量值首先在表达式中使用,然后在操作后递增。

例如,如果在代码中使用:

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 ++,将在表达式中使用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实现中使用的,它比链表的实现快一点。

在下面的代码中,检查push和pop功能。

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

问题已经回答,但也允许我补充。

首先,++表示递增1,而-表示递减1。

现在x ++表示在此行之后递增x,而++ x表示在此行之前递增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
如果加上一些解释,这种回应会更好。
2015年

0

在i ++中,它称为postincrement,并且在随后递增的任何上下文中使用该值。++ 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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.