|
||||||||||||||||||||||||||||||||||||||||||||
Часть I Процедурное программирование в С++ Глава 1 Глава 2 Глава 3 Глава 4 Глава 5 Глава 6 Часть II Объективно- ориентированное программирование в С++ Глава 7 Глава 8 Глава 9 Глава 10 Глава 11 Глава 12 |
|
Примечания |
||||||||||||||||||||||||||||||||||||||||||
Первые пять операторов являются бинарными, то есть используются с двумя операндами. За исключением операторов деления по модулю(остаток от целочисленного деления), инкремента и декремента, операторы совпадают с соответствующими математическими операторами. Если оператор деления по модулю особых комментариев не требует, то операторы инкремента и декремента в определённом смысле являются визитной карточкой языка С++. Оператор инкремента даже присутствует в названии языка. Операторы инкремента и декремента являются унарными(используются с одним операндом). Действие операторов состоит в увеличении или уменьшении значения операнда на единицу. Например, результат выполнения команды i++ есть увеличение значения переменной i на единицу. Другими словами, команды i++ и i = i + 1 с точки зрения влияния на значение переменной i являются эквивалентными. Аналогично в результате команды i-- значение переменной i уменьшается на единицу, как и в результате выполнения команды i = i - 1. Операторы инкремента и декремента могут использоваться в префиксной и постпрефиксной формах. В префиксной форме оператор указывается перед операндом, а в постфиксной форме - после него. Выше операторы инкремента и декремента использованы используются в постфиксной форме. В префиксной форме соответствующие операции выглядели бы как ++i и --i. В плане действия на операнд разницы в префиксной и постфиксной формах нет. В результате выполнения команды ++i значение переменной i увеличивается на единицу, как и для команды i++. Уменьшение значения переменной i на единицу осуществляется при использовании команды --i. В этом отношении она не отличается от команды i--. Разница между префиксной и постфиксной формами операторов инкремента и декремента проявляются в ситуации, когда эти операторы использованы в выражениях. Естественным образом возникает вопрос относительно переменной-операнда, по отношению к которой применяется операция инкремента или декремента и которая является составной частью более сложного выражения: следует ли сначала вычислить выражение и затем изменить значение переменной или сначала следует изменить значение переменной, а уж потом вычислять выражение? Ответ следующий: для префиксной формы сперва изменяется значение переменной, а затем рассчитывается выражение, а для постфиксной формы выражение вычисляется со старым значением переменной, а только после этого изменяется значение этой переменной. В этом и состоит разница между префиксной и постфиксной формами операторов инкремента и декремента. Проиллюстрируем сказанное на примере. В листинге 1.5 приведён код программы, в которой использованы операторы инкремента и декремента в префиксной и постфиксной формах. ==========>Листинг 1.5 Код программы с операторами инкремента и декремента #include<iostream> using namespace std; int main(){ int n,m,i=3,j=3; cout<<"Имеем две переменные со значениями:\n"; cout<<"i = "<<i<<"\n"; cout<<"j = "<<j<<"\n"; cout<<"После команды n=i++ :\n"; n=i++;// Теперь n=3, а i=4 cout<<"n = "<<n<<"\n"; cout<<"i = "<<i<<"\n"; cout<<"После команды m=++j :\n"; m=++j;// Значение переменных m=4 и j=4 cout<<"m = "<<m<<"\n"; cout<<"j = "<<j<<"\n"; cout<<"После команды n=(--i)*(i--) :\n"; n=(--i)*(i--);// Теперь n=9, а i=2 cout<<"n = "<<n<<"\n"; cout<<"i = "<<i<<"\n"; cout<<"После команды m=(--j)*(--j) :\n"; m=(--j)*(--j);// Теперь m=4, а j=2 cout<<"m = "<<m<<"\n"; cout<<"j = "<<j<<"\n"; cout<<"После команды n=(--i)*(i++) :\n"; n=(--i)*(i++);// Теперь n=1, а i=2 cout<<"n = "<<n<<"\n"; cout<<"i = "<<i<<"\n"; cout<<"После команды m=(j--)*(++j) :\n"; m=(j--)*(++j);// Теперь m=9, а j=2 cout<<"m = "<<m<<"\n"; cout<<"j = "<<j<<"\n"; cout<<"После команды n=(--i)*(++i) :\n"; n=(--i)*(++i);// Теперь n=4, а i=2 cout<<"n = "<<n<<"\n"; cout<<"i = "<<i<<"\n"; cout << "Конец задания для самостоятельной работы!" << endl; system ("pause"); // ожидаем нажатия кнопки return 0; } ==========>Конец Листинга 1.5 Компилированный исполняемый файл листинга 1.5(120Кб, rar) В начале программы инициализируются две переменные i и j с одинаковыми начальными значениями, равными 3. Разница между префиксной и постфиксной формами операторов инкремента и декремента иллюстрируются простыми командами: n=i++ и m=++j. В результате обе переменные i и j увеличивают своё значение на единицу: после выполнения команд они равняются 4. Причина в том, что при вычислении значения переменной n ей сначала присваивается значение i, а затем переменная i увеличивается на единицу. При вычислении значения переменной m сначала на единицу увеличивается значение переменной j , и только после этого значение переменной j присваивается переменной m. Однако ситуация не всегда так однозначна Например, если после означенных выше команд выполнить команду n=(--i)*(i--), получим для переменной i значение 2, адля переменной n значение 9. Алгоритм вычисления переменных при этом следующий. Поскольку выражение, на основе которого вычисляется значение переменной n, является произведением двух выражений(то есть (--i) и (i--)), то предварительно рассчитываются эти выражения. Результатом выражения (--i) является число 3(значение i уменьшенное на единицу), причем это же значение присваивается переменной i. Такое же значение возвращается выражением (i--), а после присваивания переменной n переменная i будет уменьшена ещё на единицу. Если воспользоваться командой m=(--j)*(--j), то получим для j значение 2(дважды значение j уменьшается на единицу), и как результат для m получаем значение 4 Напротив, после выполнения команды n=(--i)*(i++) имеем для i значение 2 и для n значение 1: уменьшается на единицу переменная i(станивится равной 1), при данном значении i вычисляется величина n(равна 1), после этого значение i увеличивается на единицу(становится равным 2). Несложно понять, что в результате выполнения команды m=(j--)*(++j) переменная m примет значение 9, а переменная j будет равняться 2. Наконеч, команду n=(--i)*(++i) следует понимать так: уменьшаем на единицу переменную i(равняется 1), увеличиваем на единицу переменную i(равняется 2), после чего вычисляем значение переменной n(равняется 4) ! Хотя операторы декремента и инкремента достаточно удобны, использовать их в выражениях следует крайне осторожно. В С++ существует достаточно удобный формат использования арифметических операторов - так называемая сокращенная форма арифметических операторов. В соответствии с сокращенной формой операторов команды вида операнд1 = операнд1 оператор операнд2 можно записать в виде операнд1 оператор = операнд2. В данном случае операнд1 и операнд2 - операторы выражения, а оператор - один из бинарных арифметических операторов. Например, команда х+=3 эквивалентна команде х=х+3, а команду а=а*b можно записать как a*=b. Сокращенная формаарифметических операторов позволяет сущестенно упростить код и очень чато используется на практике. |
||||||||||||||||||||||||||||||||||||||||||||
В основу сайта положена информация из книги "Самоучитель C++ с примерами и задачами. Книга + CD", СПб, Наука и Техника, 2010. - 480с.: ил.(+CD) 2010 - 2011 Все авторские права сохранены |