Счетчик цикла i как I++ против i+1 как позиция в массиве
Я сделал цикл с i, так как это переменная счетчика.
Внутри этого цикла я сравниваю ячейки массива.
Мне интересно, в чем разница между массивом [i++] (или массивом [++i]) и массивом [i+1].
Поскольку i++ (или ++i) не работают должным образом, в то время как i + 1 работает (маленькая сумка, которая сводила меня с ума).
Заранее спасибо.
7 ответов
array[i++]
будет оцениватьarray[i]
и приращениеi
,array[++i]
будет увеличиватьсяi
а затем оценитьarray[i]
(так что это дает вам следующий элемент)array[i+1]
даст вам следующий элемент без увеличенияi
Лично я стараюсь избегать использования таких побочных эффектов - это значит, что когда я читаю код позже, мне всегда приходится замедляться, чтобы убедиться, что я все получаю в правильном порядке.
Если вы уже в цикле, который увеличивается i
, затем увеличивая i
в выражении доступа к массиву также будет означать, что каждая итерация цикла будет увеличиваться i
дважды.
i++
, ++i
, а также i+1
все разные выражения (или операции). Вы должны проконсультироваться со своей любимой ссылкой на Java, чтобы узнать о разнице.
(Короче: i++
приращений i
но возвращает исходное значение, ++i
приращений i
и возвращает новое значение, i+1
не увеличивается i
но возвращает значение i+1
.)
Относительно того, почему именно ваш цикл не работает так, как вы ожидаете: на это нельзя ответить, не увидев фактически ваш код - вполне логично. Я предполагаю, что вы либо использовали неправильные выражения и / или что вы увеличили i
дважды за цикл.
array[i++]
даст вам так же, как array[i]
а затем увеличить i
, array[++i]
даст вам так же, как array[i+1]
и приращение i
, array[i+1]
на самом деле не изменит значение i
,
i++
: увеличить значение, хранящееся вi
по одному и вернуть старое значение.++i
: увеличить значение, хранящееся вi
на единицу и вернуть новое значение.i+1
: вернуть суммуi
а также1
без изменения значения, хранящегося вi
Теперь рассмотрим, что произойдет, если, как я подозреваю, у вас есть код, который выглядит как
for ( i = 0; i < something; i++ )
{
dosomething(i++);
}
значения i
перешел к dosomething()
будет 0
2
4
8
.,
так как каждая итерация цикла, i
увеличивается один раз в for()
линия и один раз в dosomething()
линия, а dosomething()
вызов дается значение i
раньше, чем это было увеличено. Если поведение на самом деле желательно для dosomething()
вызываться с последовательностью 1
2
3
4
., тогда вам нужно избегать обновления i
с результатом добавления 1 к нему в теле цикла:
for ( i = 0; i<что-то; i ++) {dosomething (i + 1); }
или даже
for ( i = 1; i < (something+1); i++ )
{
dosomething(i);
}
array[i++]
означает "взять элемент массива с индексом i, затем увеличить i".array[i+1]
означает "возьмите элемент массива с индексом i+1, не изменяйте i".
Давайте определимся i=0
, затем
i++
вернусь0
и впоследствии приращениеi
в1
(постинкремент: возвращает значение, затем увеличивается)++i
будет увеличиватьсяi
в1
а потом вернуться1
(до приращения: увеличивается, потом возвращается значение)ì+1
не будет увеличиватьсяi
и вернуться1
(дополнение: только вернуть результат, не трогая переменную)
Я предполагаю, что вы не хотите увеличивать i самостоятельно, только добавьте 1, чтобы получить доступ к индексу с другим смещением.
Не работает должным образом, потому что вы увеличиваете I дважды в каждом цикле.
Так что если ваш массив {1,2,3,4,5,6,7}
и вы напечатали array[++i]
начиная с i=0, он напечатает "2,4,6", затем бросит ArrayOutOfBoundsExcpetion
, если массив {1,2,3,4,5,6,7,8}
будет напечатано "2,4,6,8"
Лучше быть вдали от ++
на счетчике циклов, кроме случаев, когда вы действительно это имеете в виду