2016-02-23 3 views
-2

Когда у меня было startIndex++ в последней строке цикла while, это вызвало бесконечный цикл, но с использованием startIndex + 1 программа работала нормально. Мне было интересно, почему это так?Разница между ++ и +1

public static int numOccurrences(String src, String q) { 

     int startIndex = src.indexOf(q); 
     int counter = 0; 

     while (startIndex != -1) { 
      counter++; 
      startIndex = src.indexOf(q, startIndex + 1); 
     } 

     return counter; 
    } 
+0

Я не уверен, что гарантии находятся на Java, но «startIndex ++» означает «increment startIndex и пусть значение выражения будет новым значением», а на C вы будете «виноваты» в изменении хранилища дважды без промежуточную точку последовательности и, следовательно, вызывают неопределенное поведение. – Vatine

+0

var ++ - это то же самое, что и var + = 1. + просто добавляет к переменной. –

ответ

3

Рассмотрим, что происходит - если indexOf не удается, он возвращает -1. Если после этого у вас был слепой startIndex++, то ваш startIndex стал бы 0, цикл обернулся бы, а 0 != -1 - ИСТИНА, продолжая цикл. Вы получите еще -1, увеличьте его до 0, а вокруг и вокруг вас - поиск, сбой, увеличение, цикл/повтор.

+1

Поскольку 'startIndex ++' оценивается перед назначением, 'startIndex' будет установлен в' -1', если 'indexOf' терпит неудачу. Затем условие while срабатывает, и цикл заканчивается. – Hoopje

+0

@Hoopje: 'Когда у меня был startIndex ++ в последней строке цикла while ... –

+0

Я думал, что он имел в виду:« вместо 'startIndex + 1'». Но я могу ошибаться, конечно. – Hoopje

3

Выражение startIndex++ увеличивает значение переменной startIndex, но возвращает старое значение startIndex. После оценки выражения, которое содержит startIndex++, вы назначаете результат startIndex. Это означает, что в вашем случае, что приращение отбрасывается, и startIndex++ и startIndex будут иметь тот же результат: одно и то же событие будет найдено каждый раз, и вы получите бесконечный цикл.

С другой стороны, выражение startIndex + 1 не изменяет значение startIndex, но вычисляет целое число, следующее за значением startIndex. Теперь indexOf начинает поиск после найденного события, поэтому у вас нет бесконечного цикла.

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