Итератор цикла for внезапно меняется

вот мой метод, это просто вложенный цикл:

IEnumerator startNewRound()
{
    string st = "آبپتثجچحخدذرضطظعغفقکگلمنوهی";
    for (int i = 0; i < st.Length; i++)
    {
        for (int j = i + 1; i < st.Length; j++)
        {
            for (int z = j + 1; z < st.Length; z++)
            {
                if (z > st.Length) continue;
                yield return new WaitForSeconds(0.1f);
                Debug.Log("I = " + i + " J = " + j + " Z= " + z);
            }
        }
    }
}

внезапно внутри цикла программа зависает на несколько секунд, счетчик 'j' меняется, и все взрывается! вот мой журнал:

Итератор цикла for внезапно меняется

не могу понять что не так!

Я не вижу ваш журнал как изображение. Опубликовать как текст

Cid 28.06.2019 12:24

В качестве примечания, журнал отладки внутри второго цикла, но вне третьего, вероятно, помог бы вам отладить проблему. Или действительно просто используя отладчик и пошагово. Вы бы быстро увидели, что j достигает значения, которое не должно было быть разрешено, и, вероятно, заметили бы проблему, описанную JamieC в своем ответе. Отладка — ваш друг.

Chris 28.06.2019 12:50
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
86
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во втором вложенном цикле вы по ошибке используете i вместо j в качестве управляющей переменной цикла:

for (int j = i + 1; i < st.Length; j++)

Должно быть

for (int j = i + 1; j < st.Length; j++)

Почему это вызывает проблему? Давайте посмотрим на соответствующую часть вывода:

I = 0 J = 24 Z= 25
I = 0 J = 24 Z= 26
I = 0 J = 25 Z= 26
I = 0 J = 2147483647 Z= -2147483648
I = 0 J = 2147483647 Z= -2147483647
I = 0 J = 2147483647 Z= -2147483646

В тот момент, когда ваш код достигает I=0, J=25 и z=26 (что на единицу меньше длины st), происходит следующее:

  • z увеличивается до 27
  • Тест в 3-м цикле проверяет z < st.Length и, таким образом, завершает этот цикл.
  • j увеличивается до 26
  • Третий цикл инициализирует z в j+1 (27)
  • Третий цикл оценивает z < st.Length - ложь. Выйдите из цикла, даже не входя в него, чтобы вывести что-либо
  • Второй цикл оценивает i < st.Length - true и входит в цикл.
  • После этого цикла j увеличивается
  • продолжать до бесконечности, пока целочисленное переполнение

Хотя это правда, не будет ли j по-прежнему инициализироваться i+1 и никогда не будет таким отрицательным значением. Другими словами, ваш ответ верен, но отвечает ли он на вопрос?

Lasse V. Karlsen 28.06.2019 12:26

отрицательное значение, вероятно, связано с переполнением int.

Stucky 28.06.2019 12:28

@LasseVågsætherKarlsen Возможно, вы правы, я не знаю - мы не можем видеть, что еще происходит. Но могу поспорить, что это как-то связано с этой переменной управления циклом!

Jamiec 28.06.2019 12:29

@Stucky: почти наверняка правда, этот ответ мог бы на самом деле объяснить, почему код делает то, что он делает. Хорошие ответы объясняют не только, что нужно изменить, но и почему это необходимо.

Chris 28.06.2019 12:29

@Chris, но мы не можем видеть достаточно остального кода, чтобы понять, что происходит. В настоящее время невозможно объяснить, но, как я уже сказал выше, я уверен, что это связано с циклом управления var!

Jamiec 28.06.2019 12:30

о, подождите ... может быть, это так.

Jamiec 28.06.2019 12:34

@Jamiec: вы абсолютно можете видеть основную проблему. По сути, третий цикл никогда ничего не делает, если j > st.length (поскольку z тоже будет). Таким образом, второй цикл продолжает увеличивать j, пока, наконец, не достигнет максимального значения, а затем z переполнится, и, наконец, третий цикл что-то сделает. Единственное, что я не могу понять, это почему j равно -2147483648, а не 2147483647. Я подозреваю, что это может быть связано с тем, что приведенный код не совсем соответствует тому результату, который нам показывают.

Chris 28.06.2019 12:41

@Крис ага. Обновленный ответ. Его не так просто описать. Я думаю, вы могли бы сделать лучше, чем я

Jamiec 28.06.2019 12:44

@Jamiec: я думаю, что ваш ответ описывает это превосходно! Я начал писать свой собственный ответ, пытаясь объяснить его полностью, и я был очень рад видеть, что вы выглядели так, будто собирались обновить, потому что мой ответ читается ужасно (добавленные детали для ответа сделали его очень беспорядочным).

Chris 28.06.2019 12:46

Я оставляю свой предыдущий комментарий, чтобы не создавать пробелов в ветке комментариев, но вы, конечно, абсолютно правы.

Lasse V. Karlsen 28.06.2019 13:29

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