Operators and Expression / 1 of 25

Содержание

Слайд 2

Operators and Expression / of 25

Задачи:
Уметь объяснять операторы присвоения
Понимать арифметические выражения
Уметь

Operators and Expression / of 25 Задачи: Уметь объяснять операторы присвоения Понимать
понимать логические и операторы сравнения
Понимать логические операторы и выражения
Понимать приоритет операторов

Слайд 3

Operators and Expression / of 25

Выражения

Комбинация операторов и операндов
Пример:

Operators and Expression / of 25 Выражения Комбинация операторов и операндов Пример:
2 * y + 5

операнды

операторы

Слайд 4

Operators and Expression / of 25

Оператор присваивания

Имя_переменной = выражение;


Оператор

Operators and Expression / of 25 Оператор присваивания Имя_переменной = выражение; Оператор
присваивания(=) может быть использован с любым правильным выражением в C

(левое значение)

(правое значение)

(Оператор присваивания)

Слайд 5

Operators and Expression / of 25

Multiple Assignment

В одном и том же

Operators and Expression / of 25 Multiple Assignment В одном и том
утверждении можно несколько раз переприсваивать одно и тоже значение нескольким переменным

a = b = c = 10;


А вот так делать нельзя:

int a = int b = int b = int c = 10

X

Слайд 6

Operators and Expression / of 25

Операторы

4 Типа

Арифметические

Операторы сравнения

Логические

Битовые

Operators and Expression / of 25 Операторы 4 Типа Арифметические Операторы сравнения Логические Битовые

Слайд 7

Operators and Expression / of 25

Арифметические
выражения

Математические выражения могут быть представлены

Operators and Expression / of 25 Арифметические выражения Математические выражения могут быть
в C, используя арифметические операторы

Примеры:

a * (b + c/d)22

++i % 7

5 + (c = 3 + 8)

Слайд 8

Operators and Expression / of 25

Арифметические
операторы

Operators and Expression / of 25 Арифметические операторы

Слайд 9

Operators and Expression / of 25

Арифметические
операторы присваивания

Operators and Expression / of 25 Арифметические операторы присваивания

Слайд 10

Operators and Expression / of 25

Инкремент и декремент

Operators and Expression / of 25 Инкремент и декремент

Слайд 11

Operators and Expression / of 25

Инкремент и декремент

С операторами инкремента/декремента версии

Operators and Expression / of 25 Инкремент и декремент С операторами инкремента/декремента
префикс всё просто.
Значение переменной сначала увеличивается/уменьшается, а затем уже вычисляется.
Например

Слайд 12

Operators and Expression / of 25

Инкремент и декремент

А вот с операторами

Operators and Expression / of 25 Инкремент и декремент А вот с
инкремента/декремента версии постфикс несколько сложнее. Компилятор создает временную копию переменной х, увеличивает или уменьшает оригинальный х (не копию), а затем возвращает копию. Только после возврата копия х удаляется. Например:

Слайд 13

Operators and Expression / of 25

Сравнительные & логические операторы

Сравнить значения в

Operators and Expression / of 25 Сравнительные & логические операторы Сравнить значения
двух переменных, или между переменной и константой

Используются для……

Операторы сравнения:

Слайд 14

Operators and Expression / of 25

Логические операторы это символы используемые для

Operators and Expression / of 25 Логические операторы это символы используемые для
соединения или отрицания операторов сравнения

Сравнительные & логические операторы-2

Выражения, в которых используются логические операторы возвращают 0 в случае ложного высказывания, и 1 в случае истинного

Пример: if (a>10) && (a<20)

Слайд 15

Operators and Expression / of 25

Логические операторы (Битовые)

Обрабатывают данные после представления

Operators and Expression / of 25 Логические операторы (Битовые) Обрабатывают данные после
чисел в их бинарную форму.(Битовое представление)

Слайд 16

Operators and Expression / of 25

Логические операторы Bitwise -2

Пример:
10 & 15?

Operators and Expression / of 25 Логические операторы Bitwise -2 Пример: 10
1010 & 1111?1010 ? 10 10 | 15? 1010 | 1111?1111 ? 15 10 ^ 15? 1010 ^ 1111?0101 ? 5 ~ 10 ? ~1010 ?1011 ? -11

Слайд 17

Operators and Expression / of 25

Преобразование типов

Процесс конвертации значений из одного

Operators and Expression / of 25 Преобразование типов Процесс конвертации значений из
типа данных в другой называется преобразованием типов. Преобразование типов может выполняться в следующих случаях:

Слайд 18

Operators and Expression / of 25

Преобразование типов

Случай №1: Присваивание или инициализация

Operators and Expression / of 25 Преобразование типов Случай №1: Присваивание или
переменной значением другого типа данных:
double k(4); // инициализация переменной типа double целым числом 4
k = 7; // присваиваем переменной типа double целое число 7

Слайд 19

Operators and Expression / of 25

Преобразование типов

Случай №2: Передача значения в

Operators and Expression / of 25 Преобразование типов Случай №2: Передача значения
функцию, где тип параметра — другой:
void doSomething(long l)
{
}
doSomething(4); // передача числа 4 (тип int) в функцию с параметром типа long

Слайд 20

Operators and Expression / of 25

Преобразование типов

Случай №3: Возврат из функции,

Operators and Expression / of 25 Преобразование типов Случай №3: Возврат из
где тип возвращаемого значения — другой:
float doSomething()
{
return 4.0; // передача значения 4.0 (тип double) из функции, которая возвращает float
}

Слайд 21

Operators and Expression / of 25

Преобразование типов

Случай №4: Использование бинарного оператора

Operators and Expression / of 25 Преобразование типов Случай №4: Использование бинарного
с операндами разных типов:
double division = 5.0 / 4; // операция деления со значениями типов double и int

Слайд 22

Operators and Expression / of 25

Преобразование типов

Есть 2 основных способа преобразования

Operators and Expression / of 25 Преобразование типов Есть 2 основных способа
типов:
Неявное преобразование типов, когда компилятор автоматически конвертирует один фундаментальный тип данных в другой.
Явное преобразование типов, когда разработчик использует один из операторов явного преобразования для выполнения конвертации объекта из одного типа данных в другой.

Слайд 23

Operators and Expression / of 25

Преобразование типов

Неявное преобразование типов (или «автоматическое

Operators and Expression / of 25 Преобразование типов Неявное преобразование типов (или
преобразование типов») выполняется всякий раз, когда требуется один фундаментальный тип данных, но предоставляется другой, и пользователь не указывает компилятору, как выполнить конвертацию
Есть 2 основных способа неявного преобразования типов:
числовое расширение;
числовая конверсия.

Слайд 24

Operators and Expression / of 25

Преобразование типов

Числовое расширение
Когда значение из одного

Operators and Expression / of 25 Преобразование типов Числовое расширение Когда значение
типа данных конвертируется в другой тип данных побольше (по размеру и по диапазону значений), то это называется числовым расширением.
Например, тип int может быть расширен в тип long, а тип float может быть расширен в тип double:
long l(65); // расширяем значение типа int (65) в тип long
double d(0.11); // расширяем значение типа float (0.11) в тип double

Слайд 25

Operators and Expression / of 25

Преобразование типов

В языке C++ есть два

Operators and Expression / of 25 Преобразование типов В языке C++ есть
варианта расширений:
Интегральное расширение (или «целочисленное расширение»). Включает в себя преобразование целочисленных типов, меньших, чем int (bool, char, unsigned char, signed char, unsigned short, signed short) в int (если это возможно) или unsigned int.
Расширение типа с плавающей точкой. Конвертация из типа float в тип double.
Интегральное расширение и расширение типа с плавающей точкой используются для преобразования «меньших по размеру» типов данных в типы int/unsigned int или double (они наиболее эффективны для выполнения разных операций).
Важно: Числовые расширения всегда безопасны и не приводят к потере данных.

Слайд 26

Operators and Expression / of 25

Преобразование типов

Числовые конверсии
Когда мы конвертируем значение

Operators and Expression / of 25 Преобразование типов Числовые конверсии Когда мы
из более крупного типа данных в аналогичный, но более мелкий тип данных, или конвертация происходит между разными типами данных, то это называется числовой конверсией.
Например:
double d = 4; // конвертируем 4 (тип int) в double
short s = 3; // конвертируем 3 (тип int) в short
В отличие от расширений, которые всегда безопасны, конверсии могут (но не всегда) привести к потере данных.

Слайд 27

Operators and Expression / of 25

Преобразование типов

Во всех случаях, когда происходит

Operators and Expression / of 25 Преобразование типов Во всех случаях, когда
конвертация значения из одного типа данных в другой, который не имеет достаточного диапазона для хранения конвертируемого значения, результаты будут неожиданные. Поэтому делать так не рекомендуется. Например, рассмотрим следующую программу:
#include
int main()
{
int i = 30000;
char c = i;
std::cout << static_cast(c);
return 0;
}
В этом примере мы присвоили огромное целочисленное значение типа int переменной типа char (диапазон которого составляет от -128 до 127). Это приведет к переполнению и следующему результату: 48

Слайд 28

Operators and Expression / of 25

Преобразование типов

Однако, если число подходит по

Operators and Expression / of 25 Преобразование типов Однако, если число подходит
диапазону, конвертация пройдет успешно. Например:
#include
int main()
{
int i = 3;
short s = i; // конвертируем значение типа int в тип short
std::cout << s << std::endl;
double d = 0.1234;
float f = d; // конвертируем значение типа double в тип float
std::cout << f << std::endl;
return 0;
}
Здесь мы получим ожидаемый результат: 3 и 0.1234

Слайд 29

Operators and Expression / of 25

Преобразование типов

В случаях со значениями типа

Operators and Expression / of 25 Преобразование типов В случаях со значениями
с плавающей точкой могут произойти округления из-за худшей точности в меньших типах.
Например:
#include
#include // для std::setprecision()
int main()
{
float f = 0.123456789; // значение типа double - 0.123456789 имеет 9 значащих цифр, но float может хранить только 7
std::cout << std::setprecision(9) << f; // std::setprecision определен в заголовочном файле iomanip
return 0;
}
В этом случае мы наблюдаем потерю в точности, так как точность типа float меньше, чем типа double: 0.123456791

Слайд 30

Operators and Expression / of 25

Преобразование типов

Обработка арифметических выражений
При обработке выражений

Operators and Expression / of 25 Преобразование типов Обработка арифметических выражений При
компилятор разбивает каждое выражение на отдельные подвыражения. Арифметические операторы требуют, чтобы их операнды были одного типа данных. Чтобы это гарантировать, компилятор использует следующие правила:
Если операндом является целое число меньше (по размеру/диапазону) типа int, то оно подвергается интегральному расширению в int или в unsigned int.
Если операнды разных типов данных, то компилятор вычисляет операнд с наивысшим приоритетом и неявно конвертирует тип другого операнда в такой же тип, как у первого.

Слайд 31

Operators and Expression / of 25

Преобразование типов

Приоритет типов операндов:
long double

Operators and Expression / of 25 Преобразование типов Приоритет типов операндов: long
(самый высокий);
double;
float;
unsigned long long;
long long;
unsigned long;
long;
unsigned int;
int (самый низкий).

Слайд 32

Operators and Expression / of 25

Преобразование типов

Пример

Автоматическое преобразование типов приведено

Operators and Expression / of 25 Преобразование типов Пример Автоматическое преобразование типов
ниже:

Char и short преобразуются в int, а float в double
Если один операнд типа double и второй типа double, то и результат будет типа double
Если один операнд типа long и второй преобразуется к типу long, то и результат будет типа double
Если операнд неопределенного типа и второй также преобразуется к неопределенному типу, то и результат будет такого же типа
Если операнды слева типа int, то и результат будет типа int

Слайд 33

Operators and Expression / of 25

Операторы явного преобразования типов данных

Конвертация C-style
В

Operators and Expression / of 25 Операторы явного преобразования типов данных Конвертация
программировании на языке Cи явное преобразование типов данных выполняется с помощью оператора (). Внутри круглых скобок мы пишем тип, в который нужно конвертировать. Этот способ конвертации типов называется конвертацией C-style. Например:
int i1 = 11;
int i2 = 3;
float x = (float)i1 / i2;
В программе, приведенной выше, мы используем круглые скобки, чтобы сообщить компилятору о необходимости преобразования переменной i1 (типа int) в тип float. Поскольку переменная i1 станет типа float, то i2 также затем автоматически преобразуется в тип float, и выполнится деление типа с плавающей точкой!

Слайд 34

Operators and Expression / of 25

Операторы явного преобразования типов данных

Язык C++

Operators and Expression / of 25 Операторы явного преобразования типов данных Язык
также позволяет использовать этот оператор следующим образом:
int i1 = 11;
int i2 = 3;
float x = float(i1) / i2;
Конвертация C-style не проверяется компилятором во время компиляции, поэтому она может быть неправильно использована, например, при конвертации типов const или изменении типов данных, без учета их диапазонов (что приведет к переполнению).

Слайд 35

Operators and Expression / of 25

Операторы явного преобразования типов данных

В

Operators and Expression / of 25 Операторы явного преобразования типов данных В
языке C++ есть еще один оператор явного преобразования типов данных — оператор static_cast.
Оператор static_cast лучше всего использовать для конвертации одного фундаментального типа данных в другой:
int i1 = 11;
int i2 = 3;
float x = static_cast(i1) / i2;
Основным преимуществом оператора static_cast является проверка его выполнения компилятором во время компиляции, что усложняет возможность возникновения непреднамеренных проблем.

Слайд 36

Operators and Expression / of 25

Операторы явного преобразования типов данных

Преобразования типов

Operators and Expression / of 25 Операторы явного преобразования типов данных Преобразования
данных следует избегать, если это вообще возможно, поскольку всякий раз, когда выполняется подобное изменение, есть вероятность возникновения непредвиденных проблем.
Но очень часто случаются ситуации, когда этого не избежать. Поэтому в таких случаях лучше использовать оператор static_cast вместо конвертации C-style.

Слайд 37

Operators and Expression / of 25

Приоритет операторов

Приоритет устанавливает иерархию одной

Operators and Expression / of 25 Приоритет операторов Приоритет устанавливает иерархию одной
группы операторов над другой, когда должно быть вычислено арифметическое выражение

Это обращает внимание на порядок, в котором вычисляются операторы в C

Приоритет операторов может быть изменен с помощью заключения нужного выражения в скобки

Слайд 38

Operators and Expression / of 25

Приоритет операторов

Приоритет устанавливает иерархию одной

Operators and Expression / of 25 Приоритет операторов Приоритет устанавливает иерархию одной
группы операторов над другой, когда должно быть вычислено арифметическое выражение

Это обращает внимание на порядок, в котором вычисляются операторы в C

Приоритет операторов может быть изменен с помощью заключения нужного выражения в скобки

Слайд 39

Operators and Expression / of 25

Приоритет операторов

Operators and Expression / of 25 Приоритет операторов

Слайд 40

Operators and Expression / of 25

Приоритет между сравнением операторов

Всегда вычисляется слева

Operators and Expression / of 25 Приоритет между сравнением операторов Всегда вычисляется слева направо
направо

Слайд 41

Operators and Expression / of 25

Приоритет для логических операторов-1

В частных

Operators and Expression / of 25 Приоритет для логических операторов-1 В частных
случаях со сложной структурой логические операторы вычисляются справа налево

Слайд 42

Operators and Expression / of 25

Примите во внимание следующее выражение:
False OR

Operators and Expression / of 25 Примите во внимание следующее выражение: False
True AND NOT False AND True
Это выражение вычисляется, как показано ниже:
False OR True AND [NOT False] AND True
NOT имеет высший приоритет.
False OR True AND [True AND True]
AND является оператором с высоким приоритетом и операторы с одинаковым приоритетом вычисляются справа налево
False OR [True AND True]
[False OR True]
True

Приоритет для логических операторов -2

Слайд 43

Operators and Expression / of 25

Когда равенство используется для того, чтобы

Operators and Expression / of 25 Когда равенство используется для того, чтобы
связать боле одного типа операторов, требуется ввести правило приоритетов для различных типов операторов

Приоритет среди разных типов операторов-1

Слайд 44

Operators and Expression / of 25

Приоритет среди разных типов операторов -2

Примите

Operators and Expression / of 25 Приоритет среди разных типов операторов -2
во внимание следующий пример:
2*3+4/2 > 3 AND 3<5 OR 10<9
Ход вычислений показан ниже:
[2*3+4/2] > 3 AND 3<5 OR 10<9 Первыми вычисляются арифметические операторы:
[[2*3]+[4/2]] > 3 AND 3<5 OR 10<9
[6+2] >3 AND 3<5 OR 10<9
[8 >3] AND [3<5] OR [10<9]

Слайд 45

Operators and Expression / of 25

Следующими вычисляются операторы сравнения, а поскольку

Operators and Expression / of 25 Следующими вычисляются операторы сравнения, а поскольку
они все имеют одинаковый приоритет, они вычисляются слева на право
True AND True OR False Последними вычисляются вычисляются логические операторы. AND имеет более высокий приоритет, чем OR
[True AND True] OR False True OR False
True

Приоритет среди разных типов операторов -3

Слайд 46

Operators and Expression / of 25

Смена приоритета-1

Скобки ( ) имеют высший

Operators and Expression / of 25 Смена приоритета-1 Скобки ( ) имеют
приоритет
Приоритет операторов может быть изменен используя скобки ( )
Операторы низкого приоритета заключенные в скобки получают высший приоритет и исполняются первыми
В случае вложенных скобок ( ( ( ) ) ), внутренние скобки будут исполняться первыми
В случае вложенных скобок вычисления выполняются слева направо

Слайд 47

Operators and Expression / of 25

Примите во внимание следующий пример:
5+9*3^2-4

Operators and Expression / of 25 Примите во внимание следующий пример: 5+9*3^2-4
> 10 AND (2+2^4-8/4 > 6 OR (2<6 AND 10>11))

Решение:
1. 5+9*3^2-4 > 10 AND (2+2^4-8/4 > 6 OR (True AND False))
Внутренние скобки обладают приоритетом над другими операторами, а действия вне скобок выполняются по обычным правилам
2. 5+9*3^2-4 > 10 AND (2+2^4-8/4 > 6 OR False)

Смена приоритета -2

Слайд 48

Operators and Expression / of 25

3. 5+9*3^2-4 >10 AND (2+16-8/4 >

Operators and Expression / of 25 3. 5+9*3^2-4 >10 AND (2+16-8/4 >
6 OR False) Затем выполняются действия во внешних скобках

4. 5+9*3^2-4 > 10 AND (2+16-2 > 6 OR False) 5. 5+9*3^2-4 > 10 AND (18-2 > 6 OR False) 6. 5+9*3^2-4 > 10 AND (16 > 6 OR False)
7. 5+9*3^2-4 > 10 AND (True OR False)
8. 5+9*3^2-4 > 10 AND True

Смена приоритета