В чем разница между я ++ и ++ я in for loop (Java)?

Возможные дубликаты:
Разница между я ++ и ++ я в цикле?
Есть ли разница между x ++ и ++ x в java?

Привет, я только начал изучать Java, и теперь я вхожу в for loop statement. Я не понимаю, как работает ++ я i ++ в инструкции цикла for.

Я имею в виду, как они работают в математических операциях, таких как сложение и вычитание. Надеюсь, кто-то мне это объяснит.

Ответ 1

Они оба увеличивают число. ++i эквивалентно i = i + 1.

i++ и ++i очень похожи, но не совсем то же самое. Оба увеличивают число, но ++i увеличивает число до того, как текущее выражение будет оценено, тогда как i++ увеличивает число после вычисления выражения.

int i = 3;
int a = i++; // a = 3, i = 4
int b = ++a; // b = 4, a = 4

Ответ 2

Здесь образец класса:

public class Increment
{
    public static void main(String [] args)
    {
        for (int i = 0; i < args.length; ++i)
        {
            System.out.println(args[i]);
        }
    }
}

Если я разбираю этот класс с помощью javap.exe, я получаю следующее:

Compiled from "Increment.java"
public class Increment extends java.lang.Object{
public Increment();
  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_0
   1:   istore_1
   2:   iload_1
   3:   aload_0
   4:   arraylength
   5:   if_icmpge       23
   8:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   11:  aload_0
   12:  iload_1
   13:  aaload
   14:  invokevirtual   #3; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   17:  iinc    1, 1
   20:  goto    2
   23:  return

}

Если я изменю цикл, чтобы он использовал я ++ и снова разобрался, я получаю следующее:

Compiled from "Increment.java"
public class Increment extends java.lang.Object{
public Increment();
  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_0
   1:   istore_1
   2:   iload_1
   3:   aload_0
   4:   arraylength
   5:   if_icmpge       23
   8:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   11:  aload_0
   12:  iload_1
   13:  aaload
   14:  invokevirtual   #3; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   17:  iinc    1, 1
   20:  goto    2
   23:  return

}

Когда я сравниваю два, TextPad сообщает мне, что они идентичны.

Это говорит о том, что с точки зрения сгенерированного байтового кода нет разницы в цикле. В других контекстах существует разница между ++ я и я ++, но не для циклов.

Ответ 3

Оба из них увеличивают переменную i на единицу. Это как сказать i = i + 1. Разница тонкая. Если вы используете его в таком цикле, нет разницы:

for (int i = 0; i < 100; i++) {
}

for (int i = 0; i < 100; ++i) {
}

Если вы хотите узнать разницу, посмотрите на этот пример:

int a = 0;
int b = a++; // b = 0; a = 1

a = 0;
b = ++a: // b = 1; a = 1

Идея состоит в том, что ++a увеличивает a и возвращает это значение, а a++ возвращает значение, а затем увеличивает a.

Ответ 4

Обрабатывается путь для цикла

1 Сначала выполняется инициализация (i = 0)

2 выполняется проверка (i < n)

3 выполняется код в цикле.

4 значение увеличивается

5 Повторите шаги 2 - 4

Именно по этой причине нет разницы между я ++ и ++ я в используемом цикле for.

Ответ 5

Разница заключается в том, что оператор post-increment i++ возвращает i, как и до приращения, а оператор pre-increment ++i возвращает i, как и после приращения. Если вы спрашиваете о типичном цикле for:

for (i = 0; i < 10; i++)

или

for (i = 0; i < 10; ++i)

Они точно такие же, поскольку вы не используете i++ или ++i как часть большего выражения.

Ответ 6

Оба i++ и ++i являются короткими для i = i + 1.

В дополнение к изменению значения я они также возвращают значение я либо перед добавлением одного (i++), либо после добавления одного (++i).

В цикле третий компонент представляет собой кусок кода, который выполняется после каждой итерации.

for (int i=0; i<10; i++)

Значение этой части не используется, поэтому приведенное выше значение совпадает с

for(int i=0; i<10; i = i+1)

или

for(int i=0; i<10; ++i)

В тех случаях, когда это имеет значение (между i++ и ++i), в этих случаях

while(i++ < 10)

for (int i=0; i++ < 10; )

Ответ 7

JLS§14.14.1, Базовый для Statement, дает понять, что выражение ForUpdate оценивается и значение ( s) отбрасываются. Эффект состоит в том, чтобы сделать две формы идентичными в контексте оператора for.