
- •Лекция №2
- •5. Операции и Выражения
- •Lvalues и Rvalues выражения
- •Унарные, бинарные и тернарное выражения
- •Приоритеты операций и порядок вычислений
- •Арифметические преобразования при вычислении выражений
- •5.1. Мультипликативные и аддитивные операции
- •Мультипликативные операции
- •Аддитивные операции
- •5.2. Операции отношения
- •Операции сравнения
- •Операции равенства
- •5.3.Логические операции
- •Второй операнд логической операции и и или вычисляется только, если это необходимо для определения результата. Операция логическое и
- •Операция логическое или
- •Операция логическое не
- •5.4. Побитовые операции
- •Операции сдвига
- •Операция побитовое и
- •Операция побитовое исключающее или
- •Операция побитовое включающее или
- •Операция побитового отрицания не
- •Отличие логических операций от логических побитовых операций
- •5.5. Операция последовательного вычисления
- •5.6. Операции присваивания
- •Простое присваивание
- •Составное присваивание
- •Побочные эффекты
- •5.7. Адресные операции
- •Операция разадресации
- •Операция взятия адреса
- •5.8. Операция sizeof
- •5.9. Условная операция
- •5.10. Операции преобразования типов
- •5.11 Особые операции
5.1. Мультипликативные и аддитивные операции
Язык С++ поддерживает стандартный набор арифметических операций:
умножение /*/
деление (/)
взятие остатка от деления(%)
сложение (+)
вычитание (-)
С++ поддерживает операцию унарного минуса (a+(-b)), которая выполняет дополнение до двух, а также, в качестве расширения по стандарту ANSI, операцию унарного плюса: (a+(+b)).
Мультипликативные операции
Мультипликативные операции *, / и % группируют слева направо. Выполняются обычные арифметические преобразования.
Форма записи:
выражение * выражение
выражение / выражение
выражение % выражение
Бинарная операция * определяет умножение. Операция * ассоциативна и выражения с несколькими умножениями на одном уровне могут быть реорганизованы компилятором.
Пример:
int i=5;
float f=0.2;
double g,z;
g=f*i;
Бинарная операция / определяет деление. При делении положительных целых округление осуществляется в сторону 0, но если какой-либо из операндов отрицателен, то форма округления является машинно-зависимой. На всех машинах, охватываемых данным руководством, остаток имеет тот же знак, что и делимое. Всегда истинно, что (a/b)*b + a%b равно a (если b не 0).
Пример:
int i=49, j=10, n, m;
n = i/j; /* результат 4 */
m = i/(-j); /* результат -4 */
Бинарная операция % дает остаток от деления первого выражения на второе.
Выполняются обычные арифметические преобразования. Операнды не должны быть числами с плавающей точкой. Операция остаток от деления (%) дает остаток от деления первого операнда на второй.
Знак результата зависит от конкретной реализации. В данной реализации знак результата совпадает со знаком делимого. Если второй операнд равен нулю, то выдается сообщение.
Пример:
int n = 49, m = 10, i, j, k, l;
i = n % m; /* 9 */
j = n % (-m); /* 9 */
k = (-n) % m; /* -9 */
l = (-n) % (-m); /* -9 */
Аддитивные операции
Аддитивные бинарные операции + и - группируют слева направо. Выполняются обычные арифметические преобразования. Каждая операция имеет некоторые дополнительные возможности, связанные с типами.
Форма записи:
выражение + выражение
выражение - выражение
Однако преобразования, выполняемые при аддитивных операциях, не обеспечивают обработку ситуаций переполнения и потери значимости. Информация теряется, если результат аддитивной операции не может быть представлен типом операндов после преобразования. При этом сообщение об ошибке не выдается.
Пример:
int i=30000, j=30000, k;
k=i+j;
В результате сложения k получит значение равное -5536.
Результатом операции + является сумма операндов. Когда целая величина складывается с указателем, то целая величина преобразуется путем умножения ее на размер памяти, занимаемой величиной, адресуемой указателем.
Когда преобразованная целая величина складывается с величиной указателя, то результатом является указатель, адресующий ячейку памяти, расположенную на целую величину дальше от исходного адреса. Новое значение указателя адресует тот же самый тип данных, что и исходный указатель.
Операция + ассоциативна и выражение с несколькими умножениями на одном уровне может быть реорганизовано компилятором.
Результатом бинарной операции - является разность операндов. Выполняются обычные арифметические преобразования. Кроме того, значение любого целого типа может вычитаться из указателя, в этом случае применяются те же преобразования, что и к сложению.
Возможна следующая комбинация операндов для операций сложения и вычитания:
1. Оба операнда целого или плавающего типа.
2. Оба операнда являются указателями на один и тот же тип.
3. Первый операнд является указателем, а второй - целым.
Отметим, что операции сложения и вычитания над адресами в единицах, отличных от длины типа, могут привести к непредсказуемым результатам.
Пример:
double d[10],* u;
int i;
u = d+2; /* u указывает на третий элемент массива */
i = u-d; /* i принимает значение равное 2 */
Аддитивные унарные операции + и - группируют справа налево .
Форма записи:
+ выражение
- выражение
Результатом унарной операции - является отрицание значения ее операнда. Операнд должен иметь целый тип. Выполняются обычные арифметические преобразования. Отрицательное значение беззнаковой величины вычисляется посредством вычитания ее значения из 2n, где n -число битов в целом типа int.
Операции инкремента /++/ и декремента /--/
Операции увеличения (++) и уменьшения (--) являются унарными операциями присваивания. Они соответственно увеличивают или уменьшают значения операнда на единицу. Операнд может быть целого или плавающего типа или типа указатель и должен быть модифицируемым. Операнд целого или плавающего типа увеличиваются (уменьшаются) на единицу. Тип результата соответствует типу операнда. Операнд адресного типа увеличивается или уменьшается на размер объекта, который он адресует. В языке допускается префиксная или постфиксная формы операций увеличения (уменьшения), поэтому значения выражения, использующего операции увеличения (уменьшения) зависит от того, какая из форм указанных операций используется.
Если знак операции стоит перед операндом (префиксная форма записи), то изменение операнда происходит до его использования в выражении и результатом операции является увеличенное или уменьшенное значение операнда.
Форма записи:
++ Выражение;
-- Выражение.
В том случае если знак операции стоит после операнда (постфиксная форма записи), то операнд вначале используется для вычисления выражения, а затем происходит изменение операнда.
Форма записи:
Выражение ++;
Выражение --
Пример:
int t=1, s=2, z, f; z=(t++)*5;
Вначале происходит умножение t*5, а затем увеличение t. В результате получится z=5, t=2.
f=(++s)/3;
Вначале значение s увеличивается, а затем используется в операции деления. В результате получим s=3, f=1.
Пример:
sum = a + b ++;
sum = a + ++b;
Первая строка производит следующие действия: складываются значения переменных а и b, результат вычисления присваивается переменной sum, затем переменная b увеличивается на единицу. Вторая строка делает следующее: значение b увеличивается на единицу, а складывается с b, результат сложения присваивается переменной sum.