Similar presentations:
Операторы языка С
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
programming