счетчик цикла i как I ++ против i + 1 как позиция в массиве - PullRequest
4 голосов
/ 15 декабря 2009

Я сделал цикл с i в качестве переменной счетчика.
Внутри этого цикла я сравниваю ячейки массива.
Мне интересно, в чем разница между массивом [i ++] (или массивом [++ i]) и массивом [i + 1].
Поскольку i ++ (или ++ i) не работают должным образом, в то время как i + 1 работает (маленькая сумка, которая сводила меня с ума).

Заранее спасибо.

Ответы [ 7 ]

15 голосов
/ 15 декабря 2009
  • array[i++] будет оценивать array[i] с шагом i.
  • array[++i] будет увеличивать i и , а затем оценивать array[i] (поэтомуследующий элемент)
  • array[i+1] даст вам следующий элемент без приращения i

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

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

7 голосов
/ 15 декабря 2009

i++, ++i и i+1 - все это различные выражения (или операции). Вы должны проконсультироваться с вашим любимым справочником по Java, чтобы узнать о разнице.

(Короче говоря: i++ увеличивает i, но возвращает исходное значение, ++i увеличивает i и возвращает новое значение, i+1 не увеличивает i, но возвращает значение i+1 .)

Относительно того, почему именно ваш цикл не работает так, как вы ожидаете: на это нельзя ответить, фактически не увидев ваш код - вполне логично. Я предполагаю, что вы либо неправильно использовали выражения и / или что вы увеличили i дважды за цикл.

2 голосов
/ 15 декабря 2009

array[i++] даст вам то же самое, что и array[i], а затем увеличит i. array[++i] даст вам то же самое, что и array[i+1], и приращение i. array[i+1] фактически не изменит значение i.

1 голос
/ 15 декабря 2009
  • 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 к нему в теле цикла: для (я = 0; я <что-то; я ++) { DoSomething (I + 1); } </p>

или даже

for ( i = 1; i < (something+1); i++ )
{
   dosomething(i);
}
0 голосов
/ 15 декабря 2009

Давайте определим i=0, затем

  • i++ вернет 0, а затем увеличит i до 1
    (постинкремент: возвращает значение, затем увеличивается)
  • ++i будет увеличивать i до 1, а затем возвращать 1
    (до приращения: увеличивается, потом возвращается значение)
  • ì+1 будет не с шагом i и возвратом 1
    (дополнение: только вернуть результат, не трогая переменную)

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

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

Не работает должным образом, потому что вы увеличиваете 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"

Лучше быть подальше от ++ на счетчике циклов, кроме случаев, когда вы действительно это имеете в виду.

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

array[i++] означает «взять элемент массива с индексом i, затем увеличить i». array[i+1] означает «взять элемент массива с индексом i + 1, не изменять i».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...