Объявление

Уважаемые посетители! Если вы обнаружили в каком-нибудь слове ошибку!
Выделите это слово и нажмите Ctrl+Enter одновременно!
Заранее спасибо за сотрудничество!

Кот кодер

 

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

 

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

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

Ну например, есть код, в котором объявлена и инициализирована переменная 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 итераций =).

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

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

Объявление

Уважаемые посетители! Если вы обнаружили в каком-нибудь слове ошибку!
Выделите это слово и нажмите Ctrl+Enter одновременно!
Заранее спасибо за сотрудничество!

Кот кодер

 

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

 

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

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

Ну например, есть код, в котором объявлена и инициализирована переменная 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 итераций =).

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

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

Developed by: Magnum © 2005 - 2018