Контакты

 Skype: Magnumv44

 Telegram: Magnumv44

 Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript.

Кот кодер

 

Важно не только знание, но и воображение, без которого знание - пустой лист. (с)

 

В процессе самообучения лично у меня, есть одна смешная особенность, а именно, я почему-то люблю задавать много очевидных, иногда не очень, но глупых вопросов на тему "а, что будет если?".

Ну и как я уже писал раньше в посте о планировании самообучения, эти вопросы будут излагаться и разбираться на примерах =)

Ну например, есть код, в котором объявлена и инициализирована переменная s типа int.


public class Main {
    public static void main(String[] args) {

        int s = 0;

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

        System.out.println(s);

    }
}

Так вот, когда у молодого (ну или в моем случае не очень =) ) программиста изучающего новый, незнакомый язык программирования (хотя по большей части логика у всех одинаковая, но суть не в этом), за неимением опыта работы с ним, глядя на этот код возникнет впечатление, что переменная s которая на входе имеет значение равное нулю, после окончания работы цикла будет иметь значение равное 1023 или около того. Увы, в данном примере оно всегда будет равно 0!

Все предельно просто, переменная объявлена перед началом цикла со значением 0, при каждом входе в цикл значение буде равно нулю, а значение, которое она получает в результате инкрементирования в постфиксной форме будет теряться по окончанию каждого прохода цикла!


s = 0

for (0; 0 < 10; 0++) {
    0 = 0 + 0++;
    /* здесь в результате математической операции значение будет равно нулю, но после нее переменная s становится равной единице */
}

// Вторая итерация
for (1; 1 < 10; 1++) {
    0 = 0 + 0++;
    /* в предыдущей итерации цикла все закончилось тем, чЧто переменная получила значение равное 1, но так как первая итераяция цикла окончена, вместе с ней закончилась и область действия, а следовательно, на входе переменная s получила опять значение равное 0 */
}

А вот если бы запись была в префиксной форме, то значение не терялось бы! То есть при каждом входе в цикл оно было бы равное математической операции из предыдущей итерации цикла.

0 = 0 + ++0 = 0 + 1 = 1
1 = 1 + ++1 = 1 + 2 = 3
3 = 3 + ++3 = 3 + 4 = 7

И так далее до момента пока цикл не пройдет все 10 итераций =).

По мимом операции инкремента, здесь еще сыграла роль области действия переменных.

Так что будьте внимательны ;)

We use cookies

We use cookies on our website. Some of them are essential for the operation of the site, while others help us to improve this site and the user experience (tracking cookies). You can decide for yourself whether you want to allow cookies or not. Please note that if you reject them, you may not be able to use all the functionalities of the site.