Lection3_Expressions.pptx
- Количество слайдов: 22
Лекция 3 Выражения
Именующее выражение (lvalue) Объект – некоторая непрерывная область памяти. Переменная – именованная область памяти, т. е. переменная – это объект. Именующее выражение (lvalue – left value) выражение, ссылающееся на объект. Имя переменной – тоже именующее выражение.
Соглашение о понятиях Оператор – встроенная функция языка со специальным синтаксисом Бинарный оператор: операнд 1 оператор операнд 2 Унарный оператор: оператор операнд оператор Виды операндов: expr (выражение, семантика значения) lvalue (выражение в левой части оператора присваивания, семантика переменной)
Арифметические операторы + expr - expr Унарный плюс Сложение Унарный минус Вычитание expr * expr / expr Умножение Деление
Целочисленные операторы expr % expr Целочисленный остаток expr << expr >> expr Побитовый сдвиг влево Побитовый сдвиг вправо x x << 1 x >> 1 0 0 0 1 0 1 0 0 0 0 1 0
Битовые операторы expr | expr & expr ^ expr ~expr Побитовое ИЛИ Побитовое исключающее ИЛИ Дополнение (инвертирование всех бит) Установить третий бит Сбросить третий бит n | (1 << 2 ) n & ~(1 << 2)
Логические операторы expr || expr && expr !expr Логическое ИЛИ Логическое отрицание
Логические и битовые операторы • Битовое И 3 & 12 = 0 (false) • Логическое И 3 && 12 = true
Операторы сравнения expr == expr != expr Равенство Неравенство expr < expr > expr <= expr >= expr Меньше Больше Меньше или равно Больше или равно
Присваивание Простое присваивание lvalue = expr Составные присваивания lvalue *= expr lvalue += expr lvalue /= expr lvalue -= expr lvalue %= expr lvalue &= expr lvalue |= expr lvalue ^= expr lvalue <<= expr lvalue >>= expr
Операторы инкремента и декремента Префиксный инкремент ++lvalue Увеличивает значение объекта --lvalue на 1 и возвращает объект Постфиксный инкремент lvalue++ Увеличивает значение объекта lvalue-на 1 и возвращает старое значение
Оператор запятая Формат expr , expr Результат expr 1, expr 2 → Ассоциативность левая: expr 1, expr 2, expr 3 → (expr 1, expr 2), expr 3 → expr 2, expr 3 → expr 3 expr 2
Тернарный оператор Формат expr 1 ? expr 2 : expr 3 Результат: Если условие expr 1 истинно, то результатом оператора является второй операнд (expr 2), в противном случае третий операнд (expr 3) Пример: char first = is_letter (x) ? ‘a’ : ‘ 0’ ;
Результат операторов Результат арифметических операторов – «наибольший» по вместительности тип операндов. При равных размерах типа операндов unsigned считается «большим» чем signed. Значения типов bool и char, как операнды арифметических операторов, приводятся к типу int до вычисления. Унарные операторы не меняют «знаковость» типа, но меняют значение. 9 / 5 ; // 1, тип int 9 / 5. ; // 1. 8, тип double -5 ; // -5, тип int -5 U ; // 4294967291, тип unsigned int unsigned short s = 5 ; 3 - 5 U ; // 4294967294, тип unsigned int 3 – s ; // -2, тип int
Результат операторов Результатом применения логических операторов ==, !=, <, >, <=, >=, &&, || является значение логического типа (bool). Результатом операторов присваивания и префиксного инкремента/декремента является lvalue. Там, где это возможно с точки зрения логики, если операндом является lvalue, то результатом тоже будет lvalue. 9 == 7 ; 0 <= a <= 5 ; 0 <= a && a <= 5 ; int a(0), b(1); (a, b) = 7 ; (true ? a : b ) = 9 ; a++++ ; ++++b ; // false // Ошибка! true <= 5 при любых a // Теперь запись верна // // b = 7, оператор , вернет lvalue b a = 9, оператор ? : вернет lvalue a Ошибка! a++ - не lvalue b += 2, т. к. ++b - lvalue
Ассоциативность Унарные операторы и операторы присваивания – правоассоциативны. - - - b означает -(-(-b)) a = b = c означает a = (b = c) Все остальные – левоассоциативны. a – b + c означает (a – b) + c a / b * c означает (a / b) * c
Последовательность вычислений Порядок вычислений в общем случае не определен! Для выражения n = f(7) + g(9); неизвестно, что вызовется первым. Исключение: Для операторов , (запятая), && (логическое И) и || (логическое ИЛИ) левый операнд вычисляется раньше правого.
Правило быстрого вычисления Если для логического оператора && или || после вычисления значения первого операнда результат однозначен, значение второго операнда не вычисляется. Примеры true || f(); false && f(); f() || g(); f() не вызывается g() вызывается, если f() ложно
Приоритет операторов Приоритет Название оператора Обозначение оператора 1 Оператор области видимости : : 2 Операторы доступа . 3 Доступ по индексу pointer [ expr ] Вызов функции expr ( expr-list ) Конструирование значения type ( expr ) Постфиксные операторы lvalue++, lvalue-- Идентификация типа typeid Приведение с проверкой времени компиляции static_cast Приведение с проверкой времени выполнения dynamic_cast Приведение без проверки reinterpret_cast Константное приведение const_cast ->
Приоритет операторов Приоритет Название оператора Обозначение оператора 4 Размер объекта или типа sizeof Префиксные инкремент и декремент ++lvalue Побитовое дополнение ~expr Логическое отрицание !expr Унарные плюс и минус +expr Адрес & lvalue Разыменование *expr Выделение и освобождение памяти new Приведение типов old-style (type) expr Доступ c разыменованием . * Доступ по указателю c разыменованием ->* 5 --lvalue -expr delete
Приоритет операторов Приоритет Название оператора Обозначение оператора 6 Умножение expr * expr Деление expr / expr Взятие остатка expr % expr Сложение expr + expr Вычитание expr – expr Сдвиг влево expr << expr Сдвиг вправо expr >> expr Меньше expr < expr Меньше или равно expr <= expr Больше expr > expr Больше или равно expr >= expr 7 8 9
Приоритет операторов Приоритет Название оператора Обозначение оператора 10 Равно expr == expr Не равно expr != expr 11 Побитовое И (AND) expr & expr 12 Побитовое исключающее ИЛИ (XOR) expr ^ expr 13 Побитовое ИЛИ (OR) expr | expr 14 Логическое И expr && expr 15 Логическое ИЛИ expr || expr 16 Тернарный оператор expr ? expr : expr 17 Присваивание lvalue = expr Cоставное присваивание lvalue += expr 18 Генерация исключения throw expr 19 Запятая expr, expr
Lection3_Expressions.pptx