Чи є різниця між x ++ та ++ x у Java?


113

Чи є різниця між ++ x і x ++ у Java?



5
... і підтвердження першої з однакових відповідей, щоб потрапити ...
skaffman

9
якнайшвидше перейдіть на здобич, сортуйте за найстарішими, натисніть подзвонити. ohowoho.
dotjoe

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

67

так

++ x збільшує значення x, а потім повертає x
x ++ повертає значення x, а потім з кроком

приклад:

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

після запуску коду і a, і b буде 1, але x буде 2.


10
+1 Багато прикладів, це пояснення з прикладами :)
Джеремі Сміт

1
Так, я також наголосив на тому, що я проголосив це через чітке прозове пояснення на початку. (Гм, не знав, що ти можеш дописуватись у коментарях сьогодні ... круто )
Jonik

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, я просто розглядав, як подати свої голоси, тому ось моє тлумачення: одна невелика причина віддати перевагу відповіді Еміля Н - це те, що його приклад код є / трохи / більш інформативним.
Джонік

Джонік. Правда, також включає ключові слова "попереднє підвищення" та "післярозвиток".
Том

Ця "відповідь" якраз і підказує результат тестового випадку, і я вважаю, що результати не є відповідями. Навпаки, зазвичай до цього питання призводить (несподіваний) результат виконання деякого коду. Звідси і моє голосування.
Альберто де Паола

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

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

х буде 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 ++ (постінкремент) значення x буде використано у виразі, а x буде збільшено на 1 після того, як вираз буде оцінено, з іншого боку ++ x (попереднє збільшення), 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 ++ означає приріст 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
Ця відповідь була б ще кращою, якби вона супроводжувалася кількома словами пояснення.
Том

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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.