openlang

Время жизни переменной в цикле

Рассмотрим такой довольно глупый фрагмент:

3.times do |round|
    cell = uninitialized Int32
    if cell == 60
        puts "cell = 60, round = #{round}"
        puts " (by chance!)" if round == 0
    end
    cell = 60
end

Каждая итерация создаёт cell заново, случайно помещая её по адресу, который занимала cell на предыдущей итерации, что объясняло бы значение 60 на третьем проходе?

Или одна переменная сохраняется на протяжении всех трёх итераций и на это можно полагаться?

Переведено с английскогоПоказать оригинал

Разговор продолжается 1

Следуя доводам
  1. Ссылка на ответ

    При использовании uninitialized переменная ссылается на память с теми данными, которые уже в ней оказались. Именно для этого существует uninitialized: память не очищается, и начальное значение по умолчанию ей не присваивается.

    Здесь cell случайно находится по одному и тому же адресу на каждой итерации. Устройство стека, вероятно, делает это поведение устойчиво наблюдаемым, но полагаться на него было бы ошибкой. Это не одна переменная, сохраняющаяся между итерациями.

    Компилятор или генератор кода при желании может поменять размещение данных.

    Переведено с английскогоПоказать оригинал

Другие стороны того же вопроса

  1. Отложить изменяемое заимствование блока очистки до его исполнения

    Как написать в Rust устойчивую к панике конструкцию, похожую на Java try { ... } finally { ... }, чтобы блоки try и finally м…

    Ответы 2Последняя активность rust
  2. Ввод массивов символов через указатели

    Когда пытаюсь вводить с клавиатуры данные в массивы char, программа каждый раз падает. Как можно удобно считывать с клавиатур…

    Ответы 2Последняя активность c
  3. Может ли функция ввода обойтись без глобальных переменных?

    Хочу написать функцию, которая обрабатывает пользовательский ввод, фильтрует его и возвращает полученную строку вызвавшей её…

    Ответы 2Последняя активность c