# for утверждения (for statements)

**Утверждение "for"** определяет повторное выполнение блока. Существует три формы: итерация может управляться единственным условием, "for" условием, "range" условием.

```
ForStmt = "for" [ Condition | ForClause | RangeClause ] Block .
Condition = Expression .
```

**for утверждения с единственным условием**

В своей простейшей форме "for" утверждение определяет повторное выполнение блока, пока булево условие оценивается как true. Условие оценивается перед каждой итерацией. Если условие отсутствует, оно эквивалентно логическому значению true.

```
for a < b {
    a *= 2
}
```

**for утверждения с "for" условием**

Утверждение "for" с ForClause также контролируется его условием, но дополнительно оно может указывать утверждения init и post, такие как утверждения присваивания, инкремента или декремента. Утверждение init может быть кратким объявлением переменной, но оператор post не должен. Переменные, объявленные утверждением init, повторно используются в каждой итерации.

```
ForClause = [ InitStmt ] ";" [ Condition ] ";" [ PostStmt ] .
InitStmt = SimpleStmt .
PostStmt = SimpleStmt .
```

```
for i := 0; i < 10; i++ {
    f(i)
}
```

Если не пусто, утверждение init выполняется один раз перед вычислением условия для первой итерации; оператор post выполняется после каждого выполнения блока (и только если блок был выполнен). Любой элемент ForClause может быть пустым, но точка с запятой обязательна, если только нет условия. Если условие отсутствует, оно эквивалентно логическому значению true.

```
for cond { S() }  то же самое что и  for ; cond ; { S() }
for      { S() }  то же самое что и  for true     { S() }
```
