Информатика и программирование Операции языка С++ Полежаев



























































Лекция 3 - Операции языка С++.ppt
- Количество слайдов: 59
Информатика и программирование Операции языка С++ Полежаев Петр Николаевич vk: vkontakte. ru/polezhaevw icq: 319280157 agent: polezhaevw@mail. ru e-mail: peter. polezhaev@gmail. com
Выражения Выражение – правила выполнения некоторых вычислений. Значение выражения – результат его вычисления. Выражения строятся из операндов, знаков операций и скобок. Операнды – данные для вычисления. Операции – действия над этими данными. Каждый операнд, в свою очередь, представляет собой выражение, переменную или константу.
Примеры выражений a + 2. 0 (a + b) * 3 + b * b a || b && c z & u & v ^ t a++ a + (b = 2) Lyamda * Max(Alpha, Beta + 1. 0) z 30
Виды операций (по количеству операндов) • Унарная операция имеет один операнд Примеры ++ (инкремент) -- (декремент) - (унарный минус) • Бинарная операция применяется к двум операндам Примеры + - * / • Тернарная операция – к трем операндам ? : (условная операция)
Виды операций (по назначению) • Операция присваивания • Арифметические операции • Операции отношения • Логические операции • Побитовые операции • Специальные операции Назовите примеры операций
Операция присваивания позволяет задавать переменным конкретные значения (сохранять данные в памяти). Формат записи операнд_1 = операнд_2; операнд_1 (lvalue) – левая часть операции присваивания. Представляет собой объект, адресующий некоторую область памяти (переменная или указатель). операнд_2 (rvalue) – правая часть операции присваивания. Представляет собой некоторое выражение.
Операция присваивания (примеры) Alpha = Beta; Gamma = 2. 0; rect. Area = rect. Width * rect. Height; A = 23 / (x + 1);
Особенность операции присваивания в языке С++ Операция присваивания в языке С++ в отличии от других языков программирования (например, Паскаля) возвращает значение – присвоенную величину. Поэтому допустимы выражения: x = y = z; //Множественное присваивание a = b + (c = 5) * 26;
Преобразование типов в операции присваивания Для операции присваивания значение правой части преобразуется к типу левой части. Пример int i; //32 -х битное целое числов со знаком char ch; //символ (8 бит) double d; //вещественное число (8 байт) //Переменной ch присваивается 8 младших разрядов i ch = i; //Переменной i присваивается целая часть переменной d i = d; //8 -битное целое число, хранящееся в ch, преобразуется в вещественное //число d d = ch; //32 -битное целое число, хранящееся в i преобразуется в вещественное //число d d = i;
Преобразование типов в операции присваивания (продолжение) Следующие преобразования не приводят к потерям: char => short int => long int float => double => long double В данных случаях происходит преобразование к типам, имеющим более широкий диапазон значений или большую точность.
Преобразование типов в операции присваивания (продолжение) Тип левого Тип правого Потери операнда signed char Если значение > 127, то результатом будет отрицательное число char short int Старшие 8 бит char int (32 бит) Старшие 24 бит short int (32 бит) Старшие 16 бит int (32 бит) long int Нет int float Дробная часть + возможно что-то еще float double Точность, результат округляется double long double Точность, результат округляется Если в таблице нет пары подходящих типов, то используйте промежуточный тип для определения потерь.
Арифметические операции + (сложение) - (вычитание) * (умножение) / (деление) % (остаток от деления) - (унарный минус) ++ (инкремент) -- (декремент)
Приоритет арифметических операций ++ -- - (унарный минус) Убывание */% приоритета +- Приоритет определяет порядок выполнения операций. Операции, имеющие одинаковый приоритет, выполняются слева направо. Для изменения приоритета операций используются скобки.
Операции сложения +, вычитания -, умножения * Применимы для целых и вещественных типов. Примеры: с = a + b; d = c * e; f = a - 2. 0; e = a * (b – 2 * a);
Операция деления / Для целочисленных операндов выполняет целочисленное деление. Для вещественных операндов выполняет обычное деление. Пример int a = 12; double a = 12. 0; int b = 5; double b = 5. 0; int c; double c; c = a / b; с == 2 Чему равно значение переменной c? с == 2. 4
Операция деления / (Замечание) Везде, где это имеет смысл по задаче лучше использовать вещественные числовые константы вместо целочисленных. Это позволяет: • Избежать ошибки использования целочисленного деления вместо вещественного • При беглом просмотре кода легко определить тип выражения • Решается проблема выбора компилятором одной из перегруженных функций
Операция получения остатка от деления % Применима только для целочисленных операндов. Примеры #include
Операция унарного минуса - Умножает свой операнд на -1 Примеры: x = -y; y = -2;
Инкремент и декремент Инкремент – увеличивает свой операнд на 1. ++x; эквивалентен x = x + 1; Декремент - уменьшает свой операнд на 1. --x; эквивалентен x = x – 1;
Инкремент и декремент (пример) #include
Формы операций инкремента и декремента • Префиксная – сначала изменяется операнд, а затем его значение становится результирующим значением операции. ++x; --y; • Постфиксная – значением операции становится исходное значение операнда, после чего он меняется. x++; y--;
Формы операций инкремента и декремента (пример) int y = 10; int z; z = ++y; z = y++; z == 11 Чему равно значение z? 10 z == int y = 22; int z; z = --y; z = y--; z == 21 Чему равно значение z? 22 z ==
Инкремент и декремент (замечание) Используйте оператор инкремента (декремента) везде, где это возможно. Это упрощает чтение текста программы, а также позволяет компилятору генерировать для них эффективный машинный код.
Операции сравнения > (больше) >= (больше или равно) < (меньше) <= (меньше или равно) != (не равно) == (равно)
Приоритет операций сравнения > >= < <= Убывание == != приоритета Результат операции сравнения имеет тип bool, который принимает значения true (истина) или false (ложь).
Замечания о true и false true может быть легко преобразован в значение 1 false может быть легко преобразован в значение 0 Обратно: Ненулевое значение легко преобразуется в true Нулевое значение легко преобразуется false
Операции сравнения (Пример) #include
Логические операции ! (НЕ, отрицание) Убывание && (И, конъюнкция) приоритета || (ИЛИ, дизъюнкция) Логические операции принимают операнды логического типа bool и возвращают результаты того же типа.
Таблицы истинности для логических операций
Логические операции (Пример 1) Вычислите значения следующих выражений: 2 <= 5 true 34. 3 < 7 || 5*5 == 25 true !1 || !2 false true || false true 1 && 2 <= 3 true 1 && 22 || 0 true x == x && x != x false
Логические операции (Пример 2) #include
Назначение логических операций и операций отношения – формирование условных выражений, используемых в конструкциях ветвления и циклах.
Побитовые операции ~ (инверсия) << (сдвиг влево) Убывание >> (сдвиг вправо) приоритета & (побитовое И) ^ (побитовое исключенное ИЛИ) | (побитовое ИЛИ) Применимы только к типу char и всем целочисленным типам.
Таблицы истинности побитовых операций ~, &, ^, | Таблицы истинности побитовых операций ~, & и | совпадают с таблицами истинности соответствующих логических операций. Таблица истинности для исключающего ИЛИ:
Принцип работы побитовых операций ~, &, ^, | Унарная операция инверсии (~) инвертирует каждый бит операнда. Побитовые бинарные операции & (И), ^ (искл. ИЛИ) и | (ИЛИ) применяются к каждой соответствующей паре бит двух операндов.
Операции сдвига битов “<<” и “>>” сдвигают все биты влево или право на указанное количество разрядов. Формат записи операторов сдвига: значение << количество_разрядов значение >> количество_разрядов При сдвиге влево освободившееся разряды обнуляются. При сдвиге вправо освободившиеся биты заполняются нулями, если первый операнд беззнакового типа, и знаковым разрядом в противном случае.
Демонстрация работы с побитовыми операциями
Демонстрация (Шаг 1) Создаем функцию печати битов переменной типа unsigned char: //Функция, печатающее двоичное представление параметра ch void Print. Binary(unsigned char ch) { //Пробегаем по всем битам, начинаю со старших for (int i = sizeof(ch) * 8 - 1; i >= 0; i--) { cout << (ch >> i & 0 x 1); // Выводим значение i-го бита } cout << endl; }
Демонстрация (Шаг 2) В функции main() описываем переменные и выводим их исходные значения в двоичной системе счисления: //Описываем переменные и инициализируем их значениями unsigned char a = 127; unsigned char b = 154; //Выводим исходные значения a и b в двоичной форме cout << "a t= "; Print. Binary(a); cout << "b t= "; Print. Binary(b);
Демонстрация (Шаг 3) В функции main() выводим в двоичной форме результаты побитовых операций ~, &, |, ^ //Выводим значения операций инверсии cout << "~a t= "; Print. Binary(~a); cout << "~b t= "; Print. Binary(~b); //Выводим значения операции поразрядного И cout << "a & b t= "; Print. Binary(a & b); //Выводим значения операции поразрядного ИЛИ cout << "a | b t= "; Print. Binary(a | b); //Выводим значения операции поразрядного исключающего ИЛИ cout << "a ^ b t= "; Print. Binary(a ^ b);
Демонстрация (Шаг 4) В функции main() выводим в двоичной форме результаты операций сдвига <<, >> //Выводим значения - результаты операций сдвига cout << "a << 1 t= "; Print. Binary(a << 1); //Сдвиг влево на 1 бит cout << "a >> 1 t= "; Print. Binary(a >> 1); //Сдвиг вправо на 1 бит cout << "b << 2 t= "; Print. Binary(b << 2); //Сдвиг влево на 2 бита cout << "b >> 2 t= "; Print. Binary(b >> 2); //Сдвиг вправо на 2 бита
Демонстрация (Шаг 5) Выполняем программу и изучаем результаты:
Специальные операции • Тернарная операция ? : • Унарная операция sizeof • Операция последовательного вычисления , • Операция приведения типа (type) • Операция взятия адреса & • Операция разыменования * • Операция [] • Операция () • Операция доступа к члену структуры. • Операция ссылки на член структуры -> Выделенные операции будет рассмотрены в лекциях позже при изучении соответствующих тем.
Тернарная операция ? : Аналогичен оператору ветвления if-else. Формат записи: Выражение_1 ? Выражение_2 : Выражение_3 Если значение Выражение_1 истинно, то вычисляется Выражение_2 и его значение становится результатом операции, иначе – вычисляется Выражение_3 и его значение становится результатом операции.
Тернарная операция ? : (Пример) //Программа вычисления max{a, b} #include
Унарная операция sizeof Вычисляет размер переменной или типа в байтах. Формат записи: sizeof переменная sizeof (тип_или_переменная) Возвращает значение типа size_t (переименованный тип unsigned int)
Унарная операция sizeof (Примеры) long double a = 23. 33; signed char ch; Вычислите значения следующих выражений (32 -битная среда): sizeof(int) 4 sizeof(ch) 1 sizeof a 10 sizeof(signed long int) 8
Операция последовательного вычисления , Позволяет вычислить несколько выражений подряд. Формат записи: выражение_1, выражение_2 Значением операции , является выражение_2. Пример: x = (a = 7, a + 1); Данная операция имеет самый низкий приоритет. Данная операция чаще всего используется в секции приращения цикла for.
Приоритеты операций Если в одном выражении есть несколько операций с одинаковым приоритетом, то унарные операции, тернарная операция и операция присваивания Убывание выполняются справа налево, приоритета остальные слева направо.
Преобразование типов в выражениях Если в выражение входят константы или переменные разных типов, то они преобразуются к одному типу – типу «наибольшего операнда» . Этот процесс называется расширением типов.
Преобразование типов в выражениях (Продолжение) Компилятор осуществляет преобразование типов следующим образом: 1. Переменные типа char и short int автоматически преобразуются в тип int (целочисленное расширение)
Преобразование типов в выражениях (Продолжение) 2. Все преобразования выполняются одно за другим по алгоритму:
Преобразование типов в выражениях (Продолжение) 3. Если один из операндов имеет тип long, второй – unsigned int и значение операнда типа unsigned int невозможно представить с помощью long, то оба оператора преобразуются в unsigned long. После выполнения преобразований типы обоих операндов одинаковы и совпадают с типом результата выражения.
Преобразование типов в выражениях (Пример)
Операция приведения типов (type) Используется для явного, принудительного приведения типов. Форма записи: (тип) выражение Тип – любой допустимый тип данных. Результат операции – приведенное значение выражения к указанному типу.
Операция приведения типов (type) (Пример) #include
Сокращенные операторы присваивания Имеют формат переменная операция= выражение; эквивалентный переменная = переменная операция выражение; операция – один из знаков операций +, -, *, /, %, <<, >>, &, |, ^
Сокращенные операторы присваивания (Примеры) x += 2. 0; y /= z; r -= 20 * sin(x); m %= 2; t <<= 2; k &= 0 x. FF;
Вопросы? • Q&A

