- •Лекция 4 Операции и выражения
- •Понятие выражения и операции
- •Классификация операций
- •Приоритеты (ранги) операций
- •Арифметические операции
- •Примеры использования арифметических операций Выделение цифр в целом числе
- •Выделение цифр в вещественном числе
- •Арифметические операции над переменными символьного типа
- •Операции инкремента и декремента
- •Особенности выполнения операций инкремента и декремента
- •Операции присваивания
- •Примеры использования
- •Операции отношения
- •Логические операции
- •Особенности выполнения логических операций
- •Примеры использования логических операций
- •Логические выражения и примеры их записи
- •Поразрядные логические операции
- •Примеры выполнения поразрядных логических операций:
- •Операции поразрядного сдвига
- •Дополнительные операции Операции доступа к компонентам структурированного объекта
- •Операции доступа к адресуемым компонентам классов
- •Определение размера sizeof
- •Вызов функции ( )
- •Индексация [ ]
- •Операция запятая ,
- •Операция расширения области видимости ::
- •Преобразование типа
- •Правила преобразования типов
- •Примеры преобразования типов
- •2. Особенности преобразования типов int и double:
- •7. Проанализируйте преобразование типов в операторах присваивания:
- •8. Приведение типа в случае использования указателей:
- •9. Преобразование старшего типа к младшему удобно использовать для выделения отдельных частей переменной или константы:
- •10. С помощью приведения типа можно получить дробную часть числа:
- •Программирование вычисления алгебраических выражений
- •Определение первого символа вводимого значения
- •Контроль правильности ввода значения переменной
- •Основные встроенные (стандартные) функции
- •Пример вычисления по формуле
- •Замечания по программированию алгебраических выражений
- •Особенности представления чисел по двоичному основанию*
- •Особенности выполнения арифметических операций над вещественными числами*
- •Операции умножения и деления
- •Операции сложения и вычитания
- •Особые ситуации Ошибки округления
- •Ошибки переполнения
- •Потеря (исчезновение) порядка
- •Катастрофическая потеря порядка
- •Потеря значащих цифр
- •Особенности выполнения операций отношения (сравнения)
- •Обратить внимание
- •Правила работы с данными вещественных типов
Операции поразрядного сдвига
операция |
содержание |
>> |
сдвиг вправо операнда слева от знака операции на число двоичных разрядов справа от знака операции; выдвигаемые биты теряются, а «вдвигаются» нулевые биты; арифметический или логический (зн. 0 ) |
<< |
сдвиг влево операнда слева от знака операции на число двоичных разрядов справа от знака операции; выдвигаемые биты теряются, а «вдвигаются» нулевые биты; арифметический или логический (зн. 0) |
Сдвиг операндов влево на 1, 2, 3 и более разрядов – наиболее быстрый способ умножения на 2, 4, 8, … Сдвиг операндов вправо на 1, 2, 3 и более разрядов – наиболее быстрый способ деления на 2, 4, 8, …
Пример 1.
2 << 7 = 256, так как:
210 = 00000000 000000102 (для типа unsigned short)
сдвиг влево на 7 разрядов этого числа дает перенос 1 на 7 разрядов влево:
00000001 000000002 = 1 * 28 = 256;
Пример 2.
256 >> 6 = 4, так как:
25610 = 00000001 000000002 (для типа unsigned short)
сдвиг вправо на 6 разрядов этого числа дает перенос 1 на 6 разрядов вправо:
00000000 000001002 = 410;
Что напечатает программа:
#define PRINT(int) printf(“int=%d\n”, int)
int x, y, z);
x=1; y=-1;
PRINT(!x | x); |
(0000 | 0001) = 0001=1 |
PRINT(~x | x); |
(1110 | 0001) = 1111= -1 |
PRINT(x ^ x); |
(0001 ^ 0001) = 0000 = 0 |
x <<= 3; PRINT(x); |
0001 1000 = 8 |
y <<= 3; PRINT(y); |
1…111 1…1000 (-1) = 11…10111 10…01000 = - 8 |
y >>= 3; PRINT(y); |
111111110001111116+8+4+2+1=31 1111111111111111 ??????? |
int sx=-8;
unsigned ux = -8;
printf (”sx=%o\n”, sx); // 177770
printf (”ux=%o\n”, ux); // 177770
printf (”sx>>3=%o\n”, sx>>3); // 177777 или 017777
printf (”ux>>3=%o\n”, ux>>3); // 017777
printf (”sx>>3=%d\n”, sx>>3); // -1 или 8191
printf (”ux>>3=%d\n”, ux>>3); // 0177778 = 1FFF= 8191
Дополнительные операции Операции доступа к компонентам структурированного объекта
Операции (. и ->) используются для выделения элемента структуры, объединения, класса.
Операция . выполняет прямой доступ к компонентам структурированного объекта. Формат применения операции:
имя_объекта.имя_компонента
Операция -> выполняет косвенный доступ к компонентам структурированного объекта, адресуемого указателем. При использовании операции требуется, чтобы с объектом был связан указатель. Формат применения операции:
указатель_на_объект->имя_компонента
Операции доступа к адресуемым компонентам классов
Операция .* – это прямое обращение к компоненту класса по имени объекта и указателю на компонент. Формат применения операции:
имя_объекта.*указатель_на_компонент
Операция ->* – это косвенное обращение к компоненту класса через указатель на объект и указатель на компонент. Формат применения операции:
указатель_на_объект->*указатель_на _компонент
Бинарная форма операции указания области видимости :: применяется для отнесения имени к конкретному пространству имен. Формат применения операции:
квалификатор_имени::имя
Квалификатором может служить имя класса или название (имя) пространства имен.
Тернарная операция (операция условия) выражение1 ? выражение2 : выражение3 если выражение1 >0 то выражение 2 иначе выражение3
(a>b) ? a=2 : b=2;
cout << ((a>b) ? a=2 : b=2) << endl;
d = (c>=0) ? c : -c;
Это единственная трехместная операция. В каждой из ветвей операции можно записать по одному выражению (соответствует оператору if, в котором в каждой ветви по одному оператору.
Например, условный оператор для преобразования прописной буквы в строчную:
if (‘A’ <= c && c <= ‘Z’) printf (“%c”, ‘a’+c-‘A’); else printf (“%c”, c);
можно заменить тернарной условной операцией:
printf (“%c”, (‘A’ <= c && c <= ‘Z’) ? (‘a’+c -‘A’) : c);
Тернарная операция не обязательно должна быть единственной в выражении. Например: R = A + (x > y ? x : y ) * B;
!!!Не для любого оператора if можно записать тернарную операцию. Она заменяет только полную форму.
Что напечатает программа:
#define PRINT(int) printf (“int = %d\n”, int)
int x=1, y=1, z=1;
x += y += z; |
y=y+z= 2; x =x+y=3 |
PRINT(x < y ? y :x); |
3 < 2 ложь x=3 |
PRINT(x < y ? x++: y++); |
3 < 2 ложь 2, а потом y=3 |
PRINT(x ); |
3 |
PRINT(y); |
3 |
PRINT(z += x < y ? x++ : y++); |
(z+=(3<3 ложь 3) 1+3=4, y=4 |
PRINT(y ); |
4 |
PRINT(z); |
4 |
x=3; y = z =4;
PRINT(z >= y >= x) ? 1: 0); |
((4>=4) >=3) (1>=3) ложь 0 |
PRINT((z >= y )&& (y >= x )); |
((4>=4) && (4>=3)) истина(1) |