Вы должны различать логический уровень и уровень реализации.
С логической точки зрения переменная на самом деле не «создана» или «разрушена», но так вы могли бы ее себе представить. Переменная - это просто , объявленная в пределах scope, поэтому она будет существовать (вы можете назначить ей и прочитать ее значение), она инициализируется в начале блока (поэтому она имеет значение 0
), и это не " t видно вне кодового блока. Вот что говорит определение языка. В C++, если вы опускаете инициализацию (т. Е. Часть =0
), язык не делает никаких предположений о том, что такое значение (поэтому компилятор может «повторно использовать» ячейку памяти). В Java, тем не менее, инициализация неявна, поэтому a
также будет установлен на ноль, если вы опустите инициализацию.
На уровне реализации компилятор более или менее свободен делать все, что захочет, до тех пор, пока он выполняет вышеуказанные спецификации. Поэтому на практике это, скорее всего, зарезервирует некоторое пространство в стеке и использует эту же память для каждой итерации, чтобы сохранить значение a
. Поскольку вы использовали инициализатор, значение 0
будет записано в это место в начале каждого цикла. Обратите внимание, что если a
не используется в пределах области действия, компилятор также может просто оптимизировать его. Или, если возможно, он может назначить его регистру CPU.
Однако теоретически компилятор также может зарезервировать «новую» ячейку памяти для a
на каждой итерации и очистить все из них в конце цикла (хотя это может привести к StackOverflow (!) Для длинных циклов. .).Или используйте распределение динамической памяти, собранное с помощью мусора (что приведет к низкой производительности ...).
В чем разница? –
Обратите внимание, что это не вопрос ООП; речь идет о правилах охвата, которые характерны для разных языков. FWIW, переменная 'int', как в этом случае, обычно будет просто назначаться реестром компилятором. – chrylis
Когда вы задаете хороший вопрос, вам не нужно беспокоиться о downvotes. –