Циклы и функции

Цикл for: три формы, break и continue

Содержание курса

Бесконечный цикл с break: суммирование чисел до ввода 0

Соберём всё вместе в задаче: читать числа с клавиатуры и накапливать их сумму, пока пользователь не введёт 0.

package main

import "fmt"

func main() {
    var sum, n int
    for {
        fmt.Scan(&n)
        if n == 0 {
            break
        }
        sum += n
    }
    fmt.Println(sum)
}

Пример работы:

3
7
-2
0
8

Обе переменные объявлены до цикла через var sum, n int, но по разным причинам.

sum — накопитель, и его объявление снаружи обязательно по двум причинам. Первая: значение должно сохраняться между итерациями. Если написать sum := 0 внутри тела цикла, на каждой итерации создаётся новая переменная с нулевым начальным значением — всё накопленное за предыдущие итерации теряется. Вторая: sum нужна после завершения цикла — в строке fmt.Println(sum). Переменная, объявленная через := внутри тела for, недоступна за его пределами; программа с sum внутри цикла попросту не скомпилировалась бы.

n — другой случай. fmt.Scan(&n) принимает адрес переменной, но само по себе это не требует объявлять n вне цикла — var n int или n := 0 внутри тела тоже допустимы синтаксически. Внешнее объявление здесь — вопрос удобства: переменная повторно используется на каждой итерации без лишних объявлений.

Почему выбрана бесконечная форма for, а не for n != 0? Потому что условие выхода проверяется уже после чтения нового значения n, то есть в середине тела. Форма только с условием потребовала бы либо читать первое число до цикла, либо дублировать логику. Бесконечный for с break внутри выражает намерение прямее: «читай до тех пор, пока сам не решишь остановиться».