Счетчик цикла 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"

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

Другие вопросы по тегам