Здравствуйте. Не волнуйтесь. Специально возвращаться к ранее изученному материалу нам не придется, поскольку и так в каждом последующем уроке мы будем использовать все, что выучили раньше. А как же иначе. Все что я вам рассказываю это самые основы, стержень языка, который наличествует в программе любой сложности. А повторение я упомянул по той причине, что сейчас мы будем учить способ, с помощью которого в языке C++ можно многократно, циклически выполнять одни и те же действия. Например, в прошлом уроке один блок кода выполнялся шесть раз. Этого можно было избежать, если бы вы были знакомы с методами организации циклов.
1. Ин и Де
Сначала я хочу вас познакомить с двумя арифметическими операторами, имеющими очень важное значение для циклов. Это такие вот интересные конструкции ++ - двойной плюс, который называют инкремента и -- двойной минус – декремента. Суть работы этих операторов очень простая. Первый повышает значение переменной на единицу, а второй уменьшает.
Code
А = 5; А++; // А станет равно шести А--; // А вновь станет равно пяти
Эта запись аналогична следующей:
Code
А = 5; А = А + 1; // А станет равно шести А = А - 1; // А вновь станет равно пяти
И результат работы обеих примеров идентичный. Просто использование инкременты и декременты проще. Но есть еще одна особенность. Эти операторы могут находится не только после, но и до переменной
Code
--А; ++А;
Подобный вариант записи операторов называется префиксным, тогда как предыдущий - постфиксным. Результат работы обоих вариантов идентичный, а вот способ этой самой работы кардинально отличается Если в выражении встречается инкремента или декремента в префиксной записи, то есть перед переменной, то значение переменной сразу уменьшается или увеличивается на единицу. Если запись постфиксная, то сначала выражение вычисляется полностью, игнорируя инкременту/декременту, и только затем эта переменная увеличивается или уменьшается на единицу. Чтобы лучше это понять приведу соответствующий пример:
Code
int x=1, y; y=(x++) * 5;
Здесь сначала х умножится на пять, значение будет присвоено у, а затем сработает инкремента и х увеличится на единицу. В результате у == 5, х == 2. Обратите внимание на использование скобок. Если этого не сделать, то компилятор потеряется в нагромождении операторов. Про ошибку он не скажет, но вот результат будет непредсказуемый. Ну и пример для префиксной записи:
Code
int x=1, y; y=(++x) * 5;
В этом случае сначала х будет увеличен, а затем умножен на 5. В результате у == 10, х == 2.
Надеюсь, что вам все понятно. Кроме того как эти операторы работают, необходимо знать что префиксная их запись работает быстрее чем постфиксная. И вот почему:
Code
y=(x++) * 5;
Когда при выполнении программы с этой строкой доходит очередь до инкременты, создается временная переменная, в которую записывается новое, увеличенное значение х. А потом, после вычисления выражения значение временной переменной обратно присваивается х. Естественно на все это тратится лишнее время. Чисто теоретически это выглядит так:
Code
int temp; // создается временная переменная temp=x+1; // ей присваивается увеличенный х, при этом сам х не меняется. y=x*5; // х умножается 5, результат присваивается у x=temp; // х присваивается значение временной переменной
Конечно, если оператор выполняется всего один раз, то затраты времени не ощутимы, а вот если это где-то в цикле повторяется несколько сотен а то и тысяч раз, то это уже совсем другое дело.
Раз мы уже упомянули способы упрощения и улучшения кода, расскажу вам еще и о вариантах оператора присвоения. Запись:
Code
А = А + 1;
Можно упростить так:
Code
А+=1;
Оба примера имеют идентичный результат работы Подобная комбинация арифметического оператора с оператором присваивания называется составным присваиванием. Составное присваивание допустимо для большинства арифметических операторов. Кроме плюса также можно использовать минус, умножение и деление.