﻿# V8016\. The loop may be executed incorrectly or its condition will never be met\. Inspect initial and final values in the 'for' loop\.

Анализатор обнаружил ошибку, связанную с тем, что в цикле for совпадают начальное и конечное значения счётчика\. 

Это может привести к нескольким проблемам:

* не будет ни одной итерации цикла;
* будет только одна итерация цикла;
* будет больше итераций, чем предполагалось\.

Рассмотрим пример для каждого из случаев\.

**Пример N1\.** Цикл не выполняется:

```cpp
func processRange(begin int, end int) {
  for i := begin; i < begin; i++ {
    ....
  }
}
```

Перед первой итерацией цикла будет выполнена проверка `i < begin`\. Данное условие всегда ложное, так как фактически проверяется, что `begin < begin`\.

Для исправления нужно использовать параметр `end` в условии цикла:

```cpp
func processRange(begin int, end int) {
  for i := begin; i < end; i++ {
    ....
  }
}
```

**Пример N2\.** Цикл выполняет не более одной итерации:

```cpp
func processRange(begin int, end int) {
  for i := end; i >= end; i-- {
    ....
  }
}
```

Перед первой итерацией выполнится проверка `i >= end`, что является истиной, поскольку значение `i` совпадает со значением `end`\. Перед второй итерацией значение `i` уменьшается на единицу\. Фактически вторая проверка примет вид `end - 1 >= end`, что является ложным\. Следовательно, цикл выполнится всего один раз\.

Для исправления нужно изменить условие выхода из цикла:

```cpp
func processRange(begin int, end int) {
  for i := end; i >= begin; i-- {
    ....
  }
}
```

**Пример N3\.** Больше итераций, чем предполагалось:

```cpp
func processRange(begin int, end int) {
  for i := end; i >= end; i++ {
    ....
  }
}
```

Перед первой итерацией условие `i >= end` будет истинным, поскольку значение `i` совпадает со значением `end`\. При последующих проверках значение `i` увеличивается, а значение `end` остаётся без изменений\. Следовательно, данный цикл завершится, когда значение счётчика `i` [переполнится](https://go.dev/ref/spec#Integer_overflow)\.

Для исправления нужно использовать параметр `begin` для инициализации `i` и изменить условие выхода из цикла:

```cpp
func processRange(begin int, end int) {
  for i := begin; i <= end; i++ {
    ....
  }
}
```