Операция определения размера sizeof
Эта операция предназначена для вычисления размера объекта или типа в байтах, и имеет две формы: sizeof выражение, sizeof ( тип )
Пример:
#include <iostream.h>
int main( ){
float x = 1;
cout << “sizeof (float) : ” << sizeof (float);
cout << “\nsizeof x : ” << sizeof x;
cout << “\nsizeof (x + 1.0) : ” << sizeof (x +1.0);
return 0;
}
Результат работы программы:
sizeof (float) : 4
sizeof x : 4
sizeof (x + 1.0) : 8
Последний результат связан с тем, что вещественные константы по умолчанию имеют тип double, к которому, как к более длинному, приводится тип переменной х и всего выражения. Скобки необходимы для того, чтобы выражение, стоящее в них, вычислялось раньше операции приведения типа, имеющей больший приоритет, чем сложение.
Операции отрицания (-, !, ~)
Арифметическое отрицание (унарный минус) - изменяет знак операнда целого или вещественного типа на противоположный.
Логическое отрицание ! меняет логическое значение операнда (true – истина или false – ложь) на противоположное. Операнд должен быть целого или вещественного типа, а также типа указатель. Операнд имеет значение ложь, если он равен нулю, все значения отличные от нуля трактуются как истина.
Поразрядное (побитовое) отрицание ~ инвертирует каждый разряд в двоичном представлении целочисленного операнда.
Деление / и остаток отделения %
Операция деленияприменима к операндам арифметического типа. Если оба операнда целочисленные, результат операции округляется до целого числа, в противном случае тип результата определяется правилами преобразования.
Операция остатка от деленияприменяется только к целочисленным операндам. Знак результата зависит от реализации.
Пример:
#include <stdio.h>
int main( ) {
int x = 11, у = 4;
float z = 4;
printf (“Результаты деления: %d %f\n”, x/y, x/z);
printf (“Остаток: %d\n”, х%у);
return 0;
}
Результат работы программы:
Результаты деления: 2 2.750000
Остаток: 3
Операции сдвига влево << и вправо >> применяются к целочисленным операндам. Они сдвигают двоичное представление первого операнда на количество двоичных разрядов, заданное вторым операндом. При сдвиге влевоосвободившиеся младшие разряды обнуляются. При сдвиге вправо освободившиеся биты заполняются нулями, если первый операнд беззнакового типа, и знаковым разрядом в противном случае. Операции сдвига не учитывают переполнение и потерю значимости.
Операции отношения <, <=, >, >=, == (равно), != (не равно) сравнивают первый операнд со вторым. Операнды могут быть арифметического типа или указателями. Результатом операции является значение true или false.
Обратите внимание на разницу между операцией проверки на равенство == и операцией присваивания =, результатом которой является значение, присвоенное левому операнду.
Поразрядные операции (конъюнкция И &, дизъюнкция ИЛИ |, исключающее ИЛИ ^)применяются только к целочисленным операндам и работают с их двоичными представлениями побитово.
При поразрядном Ибит результата равен 1 только тогда, когда соответствующие биты обоих операндов равны 1.
При поразрядном ИЛИ бит результата равен 1 тогда, когда соответствующий бит хотя бы одного из операндов равен 1.
При поразрядном исключающем ИЛИ бит результата равен 1 только тогда, когда соответствующий бит только одного из операндов равен 1.
Пример:
#include <iostream.h>
int main( ){
cout << “6 & 5 = ” << (6 & 5);
cout << “\n 6 | 5 = ” << (6 | 5);
cout << “\n 6 ^ 5 = ” << (6 ^ 5);
return 0;
}
Результат работы программы:
6 & 5 = 4
6 | 5 = 7
6 ^ 5 = 3
Логические операции (конъюнкция И && и дизъюнкция ИЛИ ||) применяются к операндам арифметического типа или типа указатель. Каждый операнд оценивается с точки зрения его эквивалентности нулю (операнд, равный нулю, рассматривается как false, не равный нулю — как true). Результатом операции также является значение true-1 или false - 0.Поэтому, если операнды имеют разный тип, преобразования типов не производятся.
Результат операции логического Иимеет значение true, если оба операнда имеют значение true.Результат операции логического ИЛИимеет значение true,если хотя бы один из операндов имеет значение true. Если значения первого операнда достаточно, чтобы определить результат операции, второй операнд не вычисляется.
Операции присваивания
В С++ определены операция простого присваивания = и операции сложного присваивания (сложение с присваиванием +=, вычитание с присваиванием -=, умножение с присваиванием *= и т. д.).
Формат операции простого присваивания: операнд_1 = операнд_2
Первый операнд должен быть L-значением, второй — выражением. Сначала вычисляется выражение, стоящее в правой части операции, а потом его результат записывается в область памяти, указанную в левой части. Мнемоническое правило: “присваивание — это передача данных “налево””. То, что ранее хранилось в этой области памяти, теряется. При присваивании производится преобразование типа выражения к типу L-значения, что может привести к потере информации.
Пример:
#include <iostream.h>
int main( ) {
int a = 3, b = 5, с = 7;
a = b; b = а; с = с + 1;
cout << “a = ” << a;
cout << “\t b = ” << b;
cout << “\t с = ” << с;
return 0;
}
Результат работы программы:
a=5 b=5 c=8
В сложных операциях присваивания при вычислении выражения, стоящего в правой части, используется и L-значение из левой части. Например, при сложении с присваиванием +=ко второму операнду прибавляется первый, и результат записывается в первый операнд, т.е. есть выражение а += b является более компактной записью выражения а = а +b.
Условная операция (?:)является тернарной, т.е. имеет три операнда.
Ее формат: операнд_1 ? операнд_2 : операнд_3
Первый операнд может иметь арифметический тип или быть указателем. Он оценивается с точки зрения его эквивалентности нулю. Если результат вычисления операнда_1 равен true, то результатом условной операции будет значение второго операнда, иначе — третьего операнда. Вычисляется всегда либо второй операнд, либо третий. Их тип может различаться. Условная операция является сокращенной формой условного оператора if.
Пример:
#include <stdio.h>
int main( ) {
int a = 11, b = 4, max;
max = (b > a) ? b : a;
printf ("Наибольшее число: %d”,max);
return 0;
}
Результат работы программы:
Наибольшее число: 11
Пример: требуется, чтобы некоторая целая величина увеличивалась на 1, если ее значение не превышает n, а иначе принимала значение 1.
i = (i < n) ? i + 1 : 1;
В таблице 1.4 приведен список рассмотренных выше операций в соответствии с их приоритетами (по убыванию приоритетов, операции с разными приоритетами разделены чертой).
Все приведенные в таблице операции, кроме условной и sizeof, могут быть перегружены.
Таблица 1.4 – Некоторые операции языка C++
Операция | Краткое описание |
Унарные операции | |
++ -- sizeof ~ ! - + | инкремент (увеличение на 1) декремент (уменьшение на 1) размер объекта или типа поразрядное отрицание логическое отрицание арифметическое отрицание (унарный минус) унарный плюс |
Бинарные и тернарная операции | |
* / % | умножение деление остаток от деления |
+ - | сложение вычитание |
<< >> | сдвиг влево сдвиг вправо |
< <= > >= | меньше меньше или равно больше больше или равно |
== != | равно не равно |
& | поразрядная конъюнкция (И) |
^ | поразрядное исключающее ИЛИ |
| | поразрядная дизъюнкция (ИЛИ) |
&& | логическое И |
|| | логическое ИЛИ |
Продолжение таблицы 1.4