2012-06-14 4 views
1

Я знаю, что это очень простой вопрос, НО.Базовый инкремент

Я понимаю концепцию позади. n ++, ++ n, n--, -n. ОДНАКО

public static void main(String[] args){ 

    int count = 1; 
    for(int i =1;i<=10;++i){ 

    count = count * i; 
    System.out.print(count); 
    } 
} 

Так он будет печатать: 1 2 3 4 5 6 7 8 9 10.

Мой Вопрос. Почему, если i увеличивается, как ++ i isnt i, то обрабатывается как 2, а не 1. Введите точку ++ i, чтобы увеличить i до того, как она будет обработана другой операцией?

+0

Приращение не выполняется до тех пор, пока не будет выполнен код внутри цикла. Вы инициализировались до 1. –

+1

Кроме того, это должно печатать 1,2,6,24 и т. Д., Так как вы умножаетесь. – Thomas

+0

Ummm, но счет никогда не изменяется .. так что вы просто умножаете то, что я на 1. – user1419012

ответ

3

Приращение не вызывается только после первой итерации цикла for.

Хотя это правда, что

j = i++; 
k = ++i; 

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

0

Вы хотите использовать i ++, который является приращением по почте. ++ i называется преинкрементом, и разница точно так же, как вы указали.

+0

Я верю, что ++ i на самом деле более эффективен для памяти при использовании таким образом. Однако конечный результат один и тот же. – SimplyPanda

+0

@ user1432824 Вы говорите, что цикл не будет работать с предварительным приращением? –

+0

Нет, Дэйв, я знаю, что оба будут работать. Мне просто интересно, какая разница между ними в этом случае. :) – user1419012

11

Является ли точка ++ i, чтобы увеличить i до того, как она будет обработана другой операцией?

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

int j = ++i; // Increment then use the new value for the assignment 
int k = i++; // Increment, but use the old value for the assignment 

В этом случае операция происходит в конце каждой итерации цикла, сама по себе. Таким образом, ваш цикл эквивалентен:

int count = 1; 
// Introduce a new scope for i, just like the for loop does 
{ 
    // Declaration and initialization 
    int i = 1; 
    // Condition 
    while (i <= 10) { 
     count = count * i; 
     System.out.print(count); 

     // Now comes the final expression in the for loop "header" 
     ++i; 
    } 
} 

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

+1

Итак, чтобы calarify int j = ++ i; // Приращение, но используйте старое значение для назначения int k = i ++; // Приращение, затем используйте новое значение для присваивания ..... Считаем, что j = i + 1, но k = j? – user1419012

+0

@ user1419012: Предполагая, что каждый оператор разделен (вместо того, чтобы рассматривать оба вместе), 'j' будет на 1 * меньше *, чем' i' после выбора, но 'k' и' i' будут иметь одинаковое значение. –

+0

у меня есть еще один, чем я? Я согласен, что k будет иметь такое же значение, как и i. – user1419012

0

В этом случае ++i происходит в конце цикла, он увеличивается и затем проверяет, соответствует ли новое значение условию завершения.

Кроме того, не выход будет:

count i 
1 * 1 = 1 
1 * 2 = 2 
2 * 3 = 6 
6 * 4 = 24 

т.д.

0

для цикла Вы писали такое же, как:

i = 1; 
while(i<=10) { 
    count = count * i; 
    System.out.print(count); 
    i = i + 1; 
} 

Так вот почему!

0

Для i = 0 и while i < 1 = 10, печать i, , а затем предварительный инкремент i. (++ i/i ++ здесь не имеет значения).

Вот попробуйте это, хотя:

int i=1; 
while(i <= 10) 
    System.out.print(++i); 


i = 1; 
while (i <= 10) 
    System.out.print(i++); 

0

В дополнение к другим ответам, историческая причина предпочтения for(int i=1;i<=10;++i) над for(int i=1;i<=10;i++) что ++i не нужно хранить старое значение i дополнительной переменной. Таким образом, ++i быстрее, чем i++, хотя улучшение скорости незначительно. Для современных компиляторов это улучшение скорости выполняется как оптимизация, поэтому две части дают один и тот же выход компилятора. Однако, поскольку ++i всегда быстр или быстрее (например, на старых компиляторах C++), чем i++, многие опытные программы всегда используют ++i в циклах.

Как указывалось в других ответах, обе части кода функционально эквивалентны (в случае цикла for).

Смежные вопросы