Страницы

Поиск по вопросам

среда, 29 января 2020 г.

Есть ли разница между объявлением переменной в цикле и за пределами цикла?

#java


Есть ли разница, в объявлении переменной за пределами цикла:

int val = 0;
for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 10; j++) {
        val++;
    }
}


И в цикле:

for (int i = 0; i < 10; i++) {
    int val = 0;
    for (int j = 0; j < 10; j++) {
        val++;
    }
}


Значение переменной val на выходе будет разным - это понятно. Но вопрос в том, влияет
ли это на производительность. Обрабатывает ли это компилятор.

Я прогонял тесты с большим количеством итераций, по времени разницы не было. Но по
логике вроде как должна была быть. Компилятор оптимизировал код?
    


Ответы

Ответ 1



Компилятор имеет полное право, код for (int i = 0; i < 10; i++) { int val = 0; for (int j = 0; j < 10; j++) { val++; } } превратить в int val; for (int i = 0; i < 10; i++) { val = 0; for (int j = 0; j < 10; j++) { val++; } } и насколько я знаю он так и делает, в результате получается одно лишнее присвоение, что мало сказывается на производительности. P.S. Вообще можно декомпилировать сгенеренный код и посмотреть, благо в какой-нибудь Идеа это делается легко и просто.

Ответ 2



Да, разница есть и заключается она в следующем: Область видимости: в первом случае, переменная val видна как внутри циклов, так и извне, во втором – видна только внутри цикла (циклов) и не видна извне. Логика работы кода: в первом случае, на каждой итерации цикла переменная val инкрементируется и итоговое значение будет 100, во втором случае, на каждой итерации внешнего цикла, переменная val сбрасывается в ноль.

Ответ 3



В вашем примере есть, причем существенная. В первом случае (объявлении вне цикла), значение переменной по итогу будет равно 100. Во втором случае - 10. Вобще разница в месте объявления переменной в том, что в некоторых случая она может выпадать из области видимости или вовсе не входить в нее.

Комментариев нет:

Отправить комментарий