Почему изменение pre на post увеличивается в итерационной части цикла for? - PullRequest
37 голосов
/ 17 декабря 2009

Почему это

 int x = 2;
    for (int y =2; y>0;y--){
        System.out.println(x + " "+ y + " ");
        x++;
    }

печатает так же, как этот?

 int x = 2;
        for (int y =2; y>0;--y){
            System.out.println(x + " "+ y + " ");
            x++;
        }

Насколько я понимаю, постинкремент сначала используется "как есть", а затем увеличивается. Предварительно инкремент сначала добавляется, а затем используется. Почему это не относится к телу цикла for?

Ответы [ 27 ]

2 голосов
/ 18 августа 2010

Попробуйте этот пример:

int i = 6;
System.out.println(i++);
System.out.println(i);

i = 10;
System.out.println(++i);
System.out.println(i);

Вы должны быть в состоянии понять, что он делает из этого.

2 голосов
/ 12 апреля 2010

Проверка выполняется до вычисления аргумента приращения. Операция увеличения выполняется в конце цикла, даже если она объявлена ​​в начале.

1 голос
/ 18 августа 2010

Если бы цикл for использовал результат выражения i++ или ++i для чего-то, то это было бы верно, но это не так, это происходит только потому, что его побочный эффект.

Вот почему вы также можете поместить туда метод void, а не просто числовое выражение.

1 голос
/ 17 декабря 2009

Поскольку значение y вычисляется в операторе for, а значение x вычисляется в отдельной строке, но в System.out.println на них есть только ссылки.

Если вы уменьшите значение внутри System.out.println, вы получите другой результат.

System.out.println(y--);
System.out.println(--y);
1 голос
/ 17 декабря 2009

Здесь много хороших ответов, но в случае, если это поможет:

Думайте о y-- и --y как о выражениях с побочными эффектами или о выражении, за которым следует выражение. у - так (подумайте об этих примерах как о псевдосборке):

decrement y
return y

и --y делает это:

store y into t
decrement y
load t
return t

В вашем примере цикла вы в любом случае отбрасываете возвращаемое значение и полагаетесь только на побочный эффект (проверка цикла происходит ПОСЛЕ выполнения инструкции декремента; она не получает / не проверяет значение, возвращаемое декрементом) .

0 голосов
/ 18 августа 2010

Различий нет, потому что каждая часть для «аргументов» - это отдельные операторы.

И что интересно, компилятор может решить заменить простые постинкрементации преинкрементами, и это ничего не изменит в коде.

0 голосов
/ 22 июня 2011

О i ++ (постинкремент) против ++ i (преинкремент) @me: "В обоих случаях выражение вычисляется, и результат используется для проверки на соответствие условию. В случае преинкремента , выражение приращения увеличивает переменную и возвращает полученное значение. Для постинкремента выражение приращения также увеличивает переменную, но возвращает предыдущее значение. В результате предварительное увеличение сравнивается с увеличенным значением, тогда как постинкремент сравнивается с исходным значением; в обоих случаях переменная была увеличена при проверке условия. " - тдаммеры

0 голосов
/ 12 апреля 2010

в вашем случае, это то же самое, без разницы.

0 голосов
/ 17 декабря 2009

Приращение выполняется как независимый оператор. Так

у -;

и

- у;

эквивалентны друг другу, и оба эквивалентны

y = y - 1;

0 голосов
/ 12 апреля 2010

Это вопрос вкуса. Они делают то же самое.

Если вы посмотрите на код классов java, вы увидите там циклы for с постинкрементом.

...