Тема 3. Операторы
169.29K
Category: programmingprogramming

Операторы языка С

1. Тема 3. Операторы

Факультет электротехники и автоматики

2.

Операторы языка С
Оператор – это команда языка программирования
высокого уровня.
Знаковые
Операторы
Логические
Арифметические
Доступа к данным
Присваивания
Побитовые
Отношения
Прочие
Операторы можно разделить на группы в зависимости от
того, с каким количеством операндов они работают:
унарные, бинарные и тернарные
2

3.

Оператор присваивания =
Формат операции простого присваивания
операнд_1 = операнд_2
Сначала вычисляется выражение, стоящее в правой части
(R-значение), а затем его результат записывается в
область памяти, указанную в левой части (L-значение).
Примером L-значения может быть имя переменной или
разадресованный указатель.
Пример кода
int a;
a = 25;
int b = 5;
a = b = 1;
//значение неопределенно
//a <- 25
//b <- 5 (инициализация)
//a <- 1 и b <- 1
3

4.

Знаковые операторы
(унарный «+» и унарный «-»)
Оператор
Назначение
+
Значение операнда без изменения знака
-
Значение операнда с противоположным знаком
Унарными операторами "+" и "-" можно присваивать знаки
переменным арифметических типов. Если перед
величиной не указан знак, то значение по умолчанию
считается положительным.
Пример кода
int a = -5;
float b = +45.67;
double c = -b;
// float b = 45.67;
// c <- -45.67
4

5.

Арифметические операторы
Бинарные
Назначение
операторы
+
Суммирует два операнда

Вычитает из первого операнда второй
*
Умножает два операнда
/
Делит первый операнд на второй
Остаток от целочисленного деления
первого операнда на второй
%
Операции умножения, деления и остатка имеют более
высокий приоритет, чем операции сложения и вычитания.
При равном приоритете операторы обрабатываются в
последовательности слева направо. Можно изменить
порядок выполнения операторов с помощью скобок.
5

6.

Арифметические операторы
Пример кода
int a = 5+3;
int b = a-2;
int c = a*b;
int d = c/10;
int e = c%10;
int f = 2+3*4-5;
int g = (2+3)*(4-5);
double h1 = 48/10;
double h2 = 48./10.;
double h3 = (double)c/(a+2);
//a <- 8
//b <- 6
//c <- 48
//d <- 4
//e <- 8
//f <- 9
//g <- -5
//h1 <- 4
//h2 <- 4.8
//h3 <- 4.8
6

7.

Побитовые операторы
Оператор
Назначение
&
Побитовое И
|
Побитовое ИЛИ
^
Побитовое исключающее ИЛИ
~
Инвертирование битов (унарный)
>>
Сдвиг вправо на заданное кол-во разрядов
<<
Сдвиг влево на заданное кол-во разрядов
Оператор &
Оператор |
Оператор ^
Оператор ~
01100001 01100001 01100001 01100001
11011011 11011011 11011011 10011110
01000001 11111011 10111010
7

8.

Побитовые операторы
Пример кода
unsigned char a = 1, b = 2;
unsigned char c = a & b;
unsigned char d = a | b;
unsigned char e = a ^ b;
unsigned char f = ~a;
//c <- 0
//d <- 3
//e <- 3
//f <- 254
unsigned char i = b << 3;
//i <- 16
// 00000010 (2) -> 00010000 (16)
unsigned char j = 7 >> 1;
//j <- 3
// 00000111 (7) -> 00000011 (3)
8

9.

9
Составные операторы присваивания
Бинарные
Назначение
операторы
Суммирует два операнда
+=
-=
*=
/=
%=
другие
Результат
Вычитает из первого операнда второй
Результат
присваивается
первому
Делит первый операнд на второй
операнду
Остаток от целочисленного деления
первого операнда на второй
<<=, >>=, &=, ^=, |=
Умножает два операнда
В языке С существуют составные операторы присваивания,
с помощью которых осуществляется как преобразование
данных, так и присваивание результата.

10.

10
Составные операторы присваивания
Пример кода
int a = 5+3;
a += 2;
a *= 7;
a /= 20;
a %= 2;
a -= 5;
//
//a = a + 2
//a = a * 7
//a = a / 20
//a = a % 2
//a = a - 5
a <- 8
a <- 10
a <- 70
a <- 3
a <- 1
a <- -4

11.

Операторы отношения
Бинарные
Назначение
операторы
==
Сравнение на равенство
!=
Сравнение на неравенство
<
Сравнение на "меньше"
>
Сравнение на "больше"
<=
Сравнение на "меньше или равно"
>=
Сравнение на "больше или равно"
Операторы отношения сравнивают два операнда, которые
также
могут
быть
представлены
выражениями.
Результатом этих операций всегда является значение true
или false.
11

12.

Операторы отношения
Пример кода
int a = 2, b = 3, c = 4, d = 5;
bool e = (b+d == a*c);
//true
bool f = (2*a != c);
//false
bool g = (d > b);
//true
bool h = (d < b);
//false
bool i = (b-a >= -2);
//true
bool j = (-2 <= a-c);
//true
12

13.

Логические операторы
Операторы
13
Назначение
&&
Логическое И (бинарный)
||
Логическое ИЛИ (бинарный)
!
Логическое НЕ (унарный)
Оператор &&
Операнды
Результат
1
2
true
true true
true false
false
false true
false
false false
false
Оператор ||
Операнды
Результат
Оператор !
2
1
Операнд Результат
true
true true
true
false
true false
true
false
true
false true
true
false false
false

14.

Логические операторы
Пример кода
bool a = true, b = false;
bool c = a && b;
//false
bool d = a || b;
bool i = !a || b;
int j = !(a && b);
//true
//false
//1 (true)
14

15.

Операторы инкремента и
декремента
Унарные
операторы
15
Назначение
L-значение++ Инкремент (увеличение на 1), постфиксная форма
++L-значение Инкремент (увеличение на 1), префиксная форма
L-значение-- Декремент (уменьшение на 1), постфиксная форма
--L-значение Декремент (уменьшение на 1), префиксная форма
Позиция инкремента и декремента определяет, какое
действие будет выполнено сначала: присваивание значения
операнда или его изменение. В префиксной форме операнд
изменяется до присваивания. В постфиксной форме
значением выражения является исходное значение
операнда, после чего он изменяется.

16.

Операторы инкремента и
декремента
Пример кода
short a = 20;
short b = a++;
short c = ++a;
short d = --a;
short e = a--;
a++;
++a;
a += ++a;
//b <- 20 и a <- 21
//с <- 22 и a <- 22
//d <- 21 и a <- 21
//e <- 21 и a <- 20
//a <- 21
//a <- 22
//a <- 46
16

17.

Оператор запятая
17
Если символ запятой используется не в списке элементов,
то он определяет последовательность вычислений. В этом
случае два выражения, разделенные запятой, вычисляются
слева направо, и значение левого выражения отбрасывается
Пример кода
float a = 5.25;
float b = (a+=1, a*2);
//b <- 12.5
Данный оператор применяется для обработки нескольких
выражений там, где синтаксис разрешает использование
только одного выражения.

18.

18
Приоритет и ассоциативность операторов
Оператор
Ассоциативность
a++ a-Слева направо
++a --a +(унарный) –(унарный) ! ~ sizeof Справа налево
* / %
Слева направо
+

Слева направо
<< >>
Слева направо
< <= > >=
Слева направо
Слева направо
==
!=
&
Слева направо
Слева направо
^
Слева направо
|
Слева направо
&&
Слева направо
||
= += –= *= /= %= <<= >>= &= |= ^= Справа налево
Слева направо
,

19.

19
Приоритет и ассоциативность операторов
Пример кода
//приоритет
int a = 4 + 2 * 3;
//a = 4 + (2 * 3) и a <- 10
int z = 2, y = 3;
z *= ++y + 5; //z = (z * ((++y) + 5)) и z <- 18
//ассоциативность
int a = 3 * 4 / 2;
//a = (3 * 4) / 2 и a <- 6
int x, y = 2, z = 3;
x = y = z;
// x = (y = z) и x <- 3

20.

20
Задача. Пересечения отрезков на прямой
На прямой заданы два отрезка. Начало и конец первого
отрезка: s1 и e1. Начало и конец второго отрезка: s2 и e2.
Определить пересекаются ли отрезки?
Пример кода
#include <iostream>
using namespace std;
int main()
{
double s1, e1, s2, e2;
cin >> s1 >> e1 >> s2 >> e2;
cout << boolalpha;
cout << ((s1 - e2 ) * ( s2 - e1 ) > 0);
}

21.

Задача. Временной интервал
21
Задано два момента времени (часы, минуты, секунды).
Определить чему равен временной интервал между этими
двумя моментами в формате (часы:минуты:секунды).
Пример кода
#include <iostream>
int main() {
int o1, m1, s1, o2, m2, s2;
std::cin >> o1 >> m1 >> s1;
std::cin >> o2 >> m2 >> s2;
int t1 = o1 * 60 * 60 + m1 * 60 + s1;
int t2 = o2 * 60 * 60 + m2 * 60 + s2 - t1;
std::cout << t2 / (60 * 60) << ':'
<< t2 / 60 % 60 << ':' << t2 % 60;}

22.

Задача. Сравнение вещественных чисел
Пример кода
#include <iostream>
using namespace std;
int main(){
cout << boolalpha;
//неправильный ответ
cout << (0.1 + 0.2 == 0.3) << endl;
//переменная error определяет точность сравнения
double error = 0.00001;
cout << (0.1 + 0.2 < 0.3 + error &&
0.1 + 0.2 > 0.3 - error);
}
22
English     Русский Rules