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

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

Лекция 3 - Операции языка С++.ppt

  • Количество слайдов: 59

>Информатика и программирование Операции языка С++  Полежаев Петр Николаевич    vk: Информатика и программирование Операции языка С++ Полежаев Петр Николаевич vk: vkontakte. ru/polezhaevw icq: 319280157 agent: polezhaevw@mail. ru e-mail: peter. polezhaev@gmail. com

>Выражения Выражение – правила выполнения некоторых вычислений. Значение выражения – результат его вычисления. Выражения Выражение – правила выполнения некоторых вычислений. Значение выражения – результат его вычисления. Выражения строятся из операндов, знаков операций и скобок. Операнды – данные для вычисления. Операции – действия над этими данными. Каждый операнд, в свою очередь, представляет собой выражение, переменную или константу.

>Примеры выражений a + 2. 0 (a + b) * 3 + b * Примеры выражений 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 Операция присваивания позволяет задавать переменным конкретные значения (сохранять данные в памяти). Формат записи операнд_1 = операнд_2; операнд_1 (lvalue) – левая часть операции присваивания. Представляет собой объект, адресующий некоторую область памяти (переменная или указатель). операнд_2 (rvalue) – правая часть операции присваивания. Представляет собой некоторое выражение.

>Операция присваивания (примеры) Alpha = Beta; Gamma = 2. 0; rect. Area = rect. Операция присваивания (примеры) 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 Преобразование типов в операции присваивания (продолжение) Следующие преобразования не приводят к потерям: 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 <iostream> Операция получения остатка от деления % Применима только для целочисленных операндов. Примеры #include using namespace std; int main() { Что программа выведет cout << 25 % 5 << endl; на консоль? cout << -50 % 11 << endl; cout << 2 % 3 << endl; return 0; }

>Операция унарного минуса - Умножает свой операнд на -1 Примеры:  x = -y; Операция унарного минуса - Умножает свой операнд на -1 Примеры: x = -y; y = -2;

>Инкремент и декремент Инкремент – увеличивает свой операнд на 1.  ++x;  эквивалентен Инкремент и декремент Инкремент – увеличивает свой операнд на 1. ++x; эквивалентен x = x + 1; Декремент - уменьшает свой операнд на 1. --x; эквивалентен x = x – 1;

>Инкремент и декремент (пример) #include <iostream> using namespace std; int main() {  double Инкремент и декремент (пример) #include using namespace std; int main() { double A = 20. 3, B = 7. 0; int x = 11, y = -6; A++; Что программа выведет на консоль? B--; x++; y--; cout << A << " " << B << endl; cout << x << " " << y << endl; return 0; }

>Формы операций инкремента и декремента • Префиксная – сначала изменяется операнд, а  затем Формы операций инкремента и декремента • Префиксная – сначала изменяется операнд, а затем его значение становится результирующим значением операции. ++x; --y; • Постфиксная – значением операции становится исходное значение операнда, после чего он меняется. x++; y--;

>Формы операций инкремента и декремента (пример) int y = 10; int z; z = Формы операций инкремента и декремента (пример) 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 Замечания о true и false true может быть легко преобразован в значение 1 false может быть легко преобразован в значение 0 Обратно: Ненулевое значение легко преобразуется в true Нулевое значение легко преобразуется false

> Операции сравнения (Пример) #include <iostream>  Задача. Определить, принадлежит ли точка с using Операции сравнения (Пример) #include Задача. Определить, принадлежит ли точка с using namespace std; int main() { координатой x отрезку [a; b] числовой оси. double x, a, b; cout << "x = “; cin >> x; cout << "a = “; cin >> a; cout << "b = “; cin >> b; if (x < a) cout << x << " is not in [" << a << "; " << b << "]" << endl; else if (x > b) cout << x << " is not in [" << a << "; " << b <<"]" << endl; else cout << x << " is in [" << a << "; " << b <<"]" << endl; return 0; }

>Логические операции !  (НЕ, отрицание)      Убывание && Логические операции ! (НЕ, отрицание) Убывание && (И, конъюнкция) приоритета || (ИЛИ, дизъюнкция) Логические операции принимают операнды логического типа bool и возвращают результаты того же типа.

>Таблицы истинности для логических операций Таблицы истинности для логических операций

>Логические операции (Пример 1) Вычислите значения следующих выражений: 2 <= 5   true Логические операции (Пример 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 <iostream>  Вернемся к задаче принадлежности точки using Логические операции (Пример 2) #include Вернемся к задаче принадлежности точки using namespace std; int main() { отрезку. Исправим программу, чтобы в ней double x, a, b; использовалась логическая операция ИЛИ cout << "x = “; cin >> x; (||). cout << "a = “; cin >> a; cout << "b = “; cin >> b; if (x < a || x > b) cout << x << " is not in [" << a << "; " << b << "]" << endl; else cout << x << " is in [" << a << "; " << b <<"]" << endl; return 0; }

>Назначение логических операций и операций отношения – формирование условных выражений, используемых в конструкциях ветвления Назначение логических операций и операций отношения – формирование условных выражений, используемых в конструкциях ветвления и циклах.

>Побитовые операции ~  (инверсия) <<  (сдвиг влево)     Побитовые операции ~ (инверсия) << (сдвиг влево) Убывание >> (сдвиг вправо) приоритета & (побитовое И) ^ (побитовое исключенное ИЛИ) | (побитовое ИЛИ) Применимы только к типу char и всем целочисленным типам.

>Таблицы истинности побитовых операций ~, &, ^, | Таблицы истинности побитовых операций ~, & Таблицы истинности побитовых операций ~, &, ^, | Таблицы истинности побитовых операций ~, & и | совпадают с таблицами истинности соответствующих логических операций. Таблица истинности для исключающего ИЛИ:

>Принцип работы побитовых операций ~, &, ^, | Унарная операция инверсии (~) инвертирует каждый Принцип работы побитовых операций ~, &, ^, | Унарная операция инверсии (~) инвертирует каждый бит операнда. Побитовые бинарные операции & (И), ^ (искл. ИЛИ) и | (ИЛИ) применяются к каждой соответствующей паре бит двух операндов.

>Операции сдвига битов “<<” и “>>” сдвигают все биты влево или право на указанное Операции сдвига битов “<<” и “>>” сдвигают все биты влево или право на указанное количество разрядов. Формат записи операторов сдвига: значение << количество_разрядов значение >> количество_разрядов При сдвиге влево освободившееся разряды обнуляются. При сдвиге вправо освободившиеся биты заполняются нулями, если первый операнд беззнакового типа, и знаковым разрядом в противном случае.

>Демонстрация работы с побитовыми операциями Демонстрация работы с побитовыми операциями

>Демонстрация (Шаг 1) Создаем функцию печати битов переменной типа unsigned 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() описываем переменные и выводим их исходные значения в Демонстрация (Шаг 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() выводим в двоичной форме  результаты побитовых операций Демонстрация (Шаг 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() выводим в двоичной форме результаты операций сдвига <<, Демонстрация (Шаг 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) Выполняем программу и изучаем результаты: Демонстрация (Шаг 5) Выполняем программу и изучаем результаты:

>Специальные операции •  Тернарная операция ? :  •  Унарная операция sizeof Специальные операции • Тернарная операция ? : • Унарная операция sizeof • Операция последовательного вычисления , • Операция приведения типа (type) • Операция взятия адреса & • Операция разыменования * • Операция [] • Операция () • Операция доступа к члену структуры. • Операция ссылки на член структуры -> Выделенные операции будет рассмотрены в лекциях позже при изучении соответствующих тем.

>Тернарная операция ? : Аналогичен оператору ветвления if-else. Формат записи:  Выражение_1 ? Выражение_2 Тернарная операция ? : Аналогичен оператору ветвления if-else. Формат записи: Выражение_1 ? Выражение_2 : Выражение_3 Если значение Выражение_1 истинно, то вычисляется Выражение_2 и его значение становится результатом операции, иначе – вычисляется Выражение_3 и его значение становится результатом операции.

>Тернарная операция ? : (Пример) //Программа вычисления max{a, b} #include <iostream> using namespace std; Тернарная операция ? : (Пример) //Программа вычисления max{a, b} #include using namespace std; int main() { int a, b, max; cin >> a >> b; max = a > b ? a : b; cout << max << endl; return 0; }

>Унарная операция sizeof Вычисляет размер переменной или типа в байтах. Формат записи:  sizeof Унарная операция sizeof Вычисляет размер переменной или типа в байтах. Формат записи: sizeof переменная sizeof (тип_или_переменная) Возвращает значение типа size_t (переименованный тип unsigned int)

>Унарная операция sizeof (Примеры) long double a = 23. 33; signed char ch; Унарная операция 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 Операция последовательного вычисления , Позволяет вычислить несколько выражений подряд. Формат записи: выражение_1, выражение_2 Значением операции , является выражение_2. Пример: x = (a = 7, a + 1); Данная операция имеет самый низкий приоритет. Данная операция чаще всего используется в секции приращения цикла for.

>Приоритеты операций     Если в одном выражении    Приоритеты операций Если в одном выражении есть несколько операций с одинаковым приоритетом, то унарные операции, тернарная операция и операция присваивания Убывание выполняются справа налево, приоритета остальные слева направо.

>Преобразование типов в выражениях Если в выражение входят константы или переменные разных типов, то Преобразование типов в выражениях Если в выражение входят константы или переменные разных типов, то они преобразуются к одному типу – типу «наибольшего операнда» . Этот процесс называется расширением типов.

>Преобразование типов в выражениях (Продолжение) Компилятор осуществляет  преобразование типов следующим  образом: 1. Преобразование типов в выражениях (Продолжение) Компилятор осуществляет преобразование типов следующим образом: 1. Переменные типа char и short int автоматически преобразуются в тип int (целочисленное расширение)

>Преобразование типов в выражениях (Продолжение) 2. Все преобразования выполняются одно за  другим по Преобразование типов в выражениях (Продолжение) 2. Все преобразования выполняются одно за другим по алгоритму:

>Преобразование типов в выражениях (Продолжение) 3. Если один из операндов имеет тип long, второй Преобразование типов в выражениях (Продолжение) 3. Если один из операндов имеет тип long, второй – unsigned int и значение операнда типа unsigned int невозможно представить с помощью long, то оба оператора преобразуются в unsigned long. После выполнения преобразований типы обоих операндов одинаковы и совпадают с типом результата выражения.

>Преобразование типов в выражениях (Пример) Преобразование типов в выражениях (Пример)

>Операция приведения типов (type) Используется для явного,  принудительного приведения типов. Форма записи: Операция приведения типов (type) Используется для явного, принудительного приведения типов. Форма записи: (тип) выражение Тип – любой допустимый тип данных. Результат операции – приведенное значение выражения к указанному типу.

>Операция приведения типов (type) (Пример) #include <iostream> using namespace std;  int main() { Операция приведения типов (type) (Пример) #include using namespace std; int main() { int a = 12; int b = 5; cout << "a / b = " << a / b << endl; cout << "(double)a / b = " << (double)a / b << endl; return 0; } Что выведет программа?

>Сокращенные операторы присваивания Имеют формат переменная операция= выражение;  эквивалентный переменная = переменная операция Сокращенные операторы присваивания Имеют формат переменная операция= выражение; эквивалентный переменная = переменная операция выражение; операция – один из знаков операций +, -, *, /, %, <<, >>, &, |, ^

>Сокращенные операторы присваивания (Примеры) x  += 2. 0; y  /= z; r Сокращенные операторы присваивания (Примеры) x += 2. 0; y /= z; r -= 20 * sin(x); m %= 2; t <<= 2; k &= 0 x. FF;

>Вопросы?  • Q&A Вопросы? • Q&A