220 likes | 409 Views
Лекция 3. Выражения. Именующее выражение ( lvalue ). Объект – некоторая непрерывная область памяти. Переменная – именованная область памяти, т.е. переменная – это объект. Именующее выражение ( lvalue – left value) выражение, ссылающееся на объект.
E N D
Лекция 3 Выражения
Именующее выражение (lvalue) Объект – некоторая непрерывная область памяти. Переменная – именованная область памяти, т.е. переменная – это объект. Именующее выражение (lvalue – left value)выражение,ссылающееся на объект. Имя переменной – тоже именующее выражение.
Соглашение о понятиях Оператор – встроенная функция языка со специальным синтаксисом Бинарный оператор: операнд1 оператор операнд2 Унарный оператор: оператор операнд операнд оператор Виды операндов: expr (выражение, семантика значения) lvalue(выражение в левой части оператора присваивания,семантика переменной)
Арифметические операторы +exprУнарный плюс expr+exprСложение -exprУнарный минус expr-expr Вычитание expr*exprУмножение expr/expr Деление
Целочисленные операторы expr%expr Целочисленный остаток expr<<exprПобитовый сдвиг влево expr>>exprПобитовый сдвиг вправо x x << 1 x >> 1
Битовые операторы expr|exprПобитовое ИЛИ expr&expr Побитовое И expr^expr Побитовое исключающее ИЛИ ~expr Дополнение (инвертирование всех бит) Установить третийбит n | (1 << 2 ) Сбросить третий бит n &~(1 << 2)
Логические операторы expr||exprЛогическое ИЛИ expr&&expr Логическое И !expr Логическое отрицание
Логические и битовые операторы • Битовое И 3& 12 = 0 (false) • Логическое И 3&& 12 = true
Операторы сравнения expr==exprРавенство expr!=expr Неравенство expr<expr Меньше expr>expr Больше expr<=expr Меньше или равно expr>=expr Больше или равно
Присваивание Простое присваивание lvalue=expr Составные присваивания lvalue *= exprlvalue /= exprlvalue %= expr lvalue += exprlvalue -= expr lvalue &= exprlvalue |= exprlvalue ^= expr lvalue <<= exprlvalue >>= expr
Операторы инкремента и декремента Префиксный инкремент ++lvalueУвеличивает значение объекта --lvalueна 1 и возвращает объект Постфиксный инкремент lvalue++Увеличивает значение объекта lvalue--на 1 и возвращает старое значение
Оператор запятая Формат expr,expr Результат expr1, expr2 → expr2 Ассоциативность левая: expr1, expr2, expr3 → (expr1, expr2), expr3 → expr2,expr3 → expr3
Тернарный оператор Формат expr1 ? expr2 : expr3 Результат: Если условие expr1 истинно, то результатом оператора является второй операнд (expr2), в противном случае третий операнд (expr3) Пример: char first = is_letter (x) ? ‘a’ : ‘0’ ;
Результат операторов Результат арифметических операторов – «наибольший» по вместительности тип операндов. При равных размерах типа операндов unsignedсчитается «большим» чем signed. Значения типов boolи char, как операнды арифметических операторов, приводятся к типу intдо вычисления. Унарные операторы не меняют «знаковость» типа, но меняют значение. 9/ 5 ; // 1, тип int 9 / 5. ; // 1.8, тип double -5 ; // -5, тип int -5U ; // 4294967291, тип unsigned int unsigned short s = 5 ; 3 - 5U ; // 4294967294, тип unsigned int 3 – s ; // -2, тип int
Результат операторов Результатом применения логических операторов ==,!=,<,>,<=,>=,&&,|| является значение логического типа (bool). Результатом операторов присваивания и префиксного инкремента/декремента является lvalue. Там, где это возможно с точки зрения логики, если операндомявляется lvalue, то результатом тоже будет lvalue. 9 == 7 ; // false 0 <= a <= 5 ; // Ошибка! true <= 5 при любых a 0 <= a && a <= 5 ; // Теперь запись верна int a(0), b(1); (a, b) = 7 ; // b = 7, оператор , вернет lvalue b (true ? a : b ) = 9 ; // a = 9, оператор ?: вернет lvalue a a++++ ; // Ошибка! a++ - не lvalue ++++b ; // 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);
Правило быстрого вычисления Если для логического оператора &&или ||после вычисления значения первого операнда результат однозначен, значение второго операнда не вычисляется. Примеры f() не вызывается f() не вызывается g() вызывается, если f() ложно true || f(); false && f(); f() || g();