Изменение итератора/счетчика цикла
Не рекомендуется менять значение итератора/счетчика цикла внутри цикла. Это может приводить к неверным вычислениям.
Также такое присвоение является частным случаем порочной практики, когда одна и та же локальная переменная используется для хранения разных промежуточных значений. - Переменная, которая используется для хранения разных промежуточных значений
Например, следующие циклы некорректны
Для Каждого Элемент Из Коллекция Цикл// первичная инициализация
Элемент = Коллекция[1];// ошибка
КонецЦикла;
Для Каждого ОчереднойЭлемент Из СледующаяКоллекция Цикл// первичная инициализация
Для Каждого ОчереднойЭлемент Из ВложеннаяКоллекция Цикл// ошибка
КакойТоКод();
КонецЦикла;
КонецЦикла;
или
Для Счетчик = 0 По Коллекция.Количество() - 1 Цикл// первичная инициализация
Счетчик = 1;// ошибка
КонецЦикла;
Для Счетчик = 0 По СледующаяКоллекция.Количество() - 1 Цикл// первичная инициализация
Для Счетчик = 10 По ВложеннаяКоллекция.Количество() - 1 Цикл// ошибка
КакойТоКод();
КонецЦикла;
КонецЦикла;
См. также
- Переменная, которая используется для хранения разных промежуточных значений
- MISRA C:2004, 13.6 - Numeric variables being used within a for loop for iteration counting shall not be modified in the body of the loop.
- MISRA C++:2008, 6-5-3 - The loop-counter shall not be modified within condition or statement.
- "for" loop stop conditions should be invariant
Экранирование кода
// sonar:LoopCounterChanged:off
// sonar:LoopCounterChanged:on