Как я учился программировать на языке С++ >> Глава 1 >> Раздел 7

Главная
Портфолио
Создание Windows приложений
Полезные ссылки
Справочник
Карта сайта
Контакты
"Нельзя быть настоящим математиком,
не будучи немного поэтом
"
  К. Вейерштрасс




Среди множества языков программирования С++ занимает особое место. Он достаточно прост, лаконичен и исключительно эффективен. Язык С++ создан профессионалами для профессионалов и является расширением языка С для поддержки объектно-ориентированной парадигмы программирования.

Содержание


Главная

Часть I
Процедурное программирование в С++

Глава 1
Глава 2
Глава 3
Глава 4
Глава 5
Глава 6

Часть II
Объективно- ориентированное  программирование в С++
 
Глава 7
Глава 8
Глава 9
Глава 10
Глава 11
Глава 12






Часть I - Процедурное программирование в С++
Глава 1 - Основы языка С++
Раздел 7 - Арифметические операторы
Раздел 1 Раздел 2 Раздел 3 Раздел 4 Раздел 5 Раздел 6
Раздел 7 Раздел 8 Раздел 9 Раздел 10 Раздел 11 Раздел 12
Примеры решения задач к Главе 1
Резюме к Главе 1
Контрольные вопросы к Главе 1
Задачи для самостоятельного решения к Главе 1
Примечания






Раздел 7

Арифметические операторы

Выражения в С++ содержат, помимо переменных, ещё и операторы. Операторы условно можно поделить на арифметические, логические, поразрядные и операторы отношения. Далее описываются особенности работы с каждой из означенных групп операторов. В первую очередь остановимся на арифметических операторах.

Арифметические операторы используются для сложения, вычитания, умножения и деления чисел. Список основных арифметических операторов, которые используются в С++, приведён в таблице 1.3.

Таблица 1.3 Арифметические операторы С++
Оператор
Назначение
+
Сложение
-
Вычитание
*
Умножение
/
Деление
%
Остаток от деления(деление по модулю)
++
Инкремент
--
Декремент

Первые пять операторов являются бинарными, то есть используются с двумя операндами. За исключением операторов деления по модулю(остаток от целочисленного деления), инкремента и декремента, операторы совпадают с соответствующими математическими операторами. Если оператор деления по модулю особых комментариев не требует, то операторы инкремента и декремента в определённом смысле являются визитной карточкой языка С++. Оператор инкремента даже присутствует в названии языка.

Операторы инкремента и декремента являются унарными(используются с одним операндом). Действие операторов состоит в увеличении или уменьшении значения операнда на единицу. Например, результат выполнения команды 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 Все авторские права сохранены
Hosted by uCoz