Преподаватель: Доцент Кафедры ВС, к.т.н. Поляков Артем Юрьевич © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» ФГОБУ ВПО "СибГУТИ" Кафедра вычислительных систем Дисциплины "ЯЗЫКИ ПРОГРАММИРОВАНИЯ" "ПРОГРАММИРОВАНИЕ" Операции
План лекции © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 2 1.Арифметические операции 2.Операции присваивания, преобразование типов данных. 3.Операции сравнения 4.Логические операции и булева алгебра.
Арифметические операции © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 3 Класс Опер.ОписаниеПример Унарная - Изменение знака int k = -z; + Изменение знака (исп. редко) - Бинарная + Аналогичны математическим операциям z = a + b; -z = a – b; *z = a * b; / Деление char/short/int/long – целая часть от деления float/double/long double – арифметическое z = a / b; % остаток от деления (только целые: char/short/int/long) z = a % b;
Целочисленная арифметика (на базе отрезков) © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 4 a b (b / a), (b % a) (b / a)(b % a) (a / b), (a % b) (a % b)(a / b) = 0 a = (a / b)b + (a % b)
Задачи для самостоятельного решения © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 5 / - целая часть от деления % - остаток от деления 1) 15 / 18 2) 10 % 14 3) 105 / 19 4) 98 % 4 5) 100 / 4 6) 32 % 4 7) 1024 / 41 8) 2048 % 41 9) 97 / 2 10) 97 % 2 11) 48 / 2 12) 48 % 2 13) 79 / 4 14) 79 % 4 15) 1024 / 3 16) 1024 % 3
Операции присваивания © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 6 Класс Опер.ОписаниеПример Унарная ++ префиксный инкремент ++i; постфиксный инкремент i++; -- префиксный декремент --i; префиксный декремент i--; Бинарная = присваивание i = j; += присваивание вида: a = b; трактуется как a = a b; например: a += b; эквив. a = a + b; i += j; -=i -= j; *=i *= j; /=i /= j; %=i %= j;...
Базовая операция присваивания ('=') © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 7 = x = 5 y = x z = x + 10 a = z + y + 1 Алгоритм операции присваивания. 1. Вычислить левостороннее значение (lvalue): становится известным местонахождение целевой ячейки. 2. Вычислить правостороннее значение (rvalue). Справа может находиться сколь угодно сложное выражения, которое может включать и операции присваивания. 3. Поместить rvalue по адресу, указанному в lvalue, при необходимости выполнить приведение типов. 4. Возвратить rvalue как результат выполнения операции.
Базовая операция '=' © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 8... int x; x = 5;... int x; x = 5; x 5 5 const! I ? ? x II C (assign.c)... movl $5,-0x4(%ebp)... movl $5,-0x4(%ebp)... AT&T assembly syntax gcc –S assign.c
Базовая операция '=' © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 9... int x; x = 5;... int x; x = 5; x 5 5 const! I ? ? x II CAT&T assembly syntax... movl $5,-0x4(%ebp)... movl $5,-0x4(%ebp)... Регистр EBP – начало стекового кадра Регистр EBP – начало стекового кадра
Базовая операция '=' © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» x 5 5 eax 5 5 y 5 5 IIIIII ? ? y... int x = 5, y; y = x;... int x = 5, y; y = x;... CAT&T assembly syntax... movl $5, -4(%ebp) movl -4(%ebp), %eax movl %eax, -8(%ebp)... movl $5, -4(%ebp) movl -4(%ebp), %eax movl %eax, -8(%ebp)...
Базовая операция '=' © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» x 5 5 eax 15 eax 15 z eax IIIIIIVI ? ? z... int x = 5, z; z = x + 10;... int x = 5, z; z = x + 10;... CAT&T assembly syntax 5 5 const! +... movl $5, -4(%ebp) movl -4(%ebp), %eax addl $10, %eax movl %eax, -8(%ebp)... movl $5, -4(%ebp) movl -4(%ebp), %eax addl $10, %eax movl %eax, -8(%ebp)...
Базовая операция '=' © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» y 5 5 eax 4 4 edx a 10 eax I 4 4 z 9 9 II... int z = 4, y = 5, a; a = z + y + 1;... int z = 4, y = 5, a; a = z + y + 1;... CAT&T assembly syntax movl $4, -4(%ebp) movl $5, -8(%ebp) movl -8(%ebp), %eax movl -4(%ebp), %edx leal (%edx,%eax), %eax addl $1, %eax movl %eax, -12(%ebp) movl $4, -4(%ebp) movl $5, -8(%ebp) movl -8(%ebp), %eax movl -4(%ebp), %edx leal (%edx,%eax), %eax addl $1, %eax movl %eax, -12(%ebp) 5 5 eax 4 4 edx eax III 1 1 const! + V
Преобразование типов данных © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 13 Типы данных имеют различное представление в памяти При присваивании происходит преобразование типа данных rvalue к типу данных lvalue. rvalue целыйвеществ. lvalue целый 1)диапазон rv = lv - простое копирование: 1010 = )диапазон rv < lv - добавление незначащих нулей: )диапазон rv > lv - отбрасывание старших разрядов: )отбрасывание дробной части: )если целая часть не помещается в диапазон lvalue, то результат не определен: float f = 1E20; веществ. Возможно отбрасывание младших разрядов, не попадающих в мантиссу: i = , f = i = , f = i = , f = )диапазон rv = lv - простое копирование. 2)диапазон rv < lv - добавление незначащих нулей: )диапазон rv > lv возможно переполнение: +/-inf или обнуление.
Операции присваивания © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 14 Класс Опер.ОписаниеПример Унарная ++ префиксный инкремент ++i; постфиксный инкремент i++; -- префиксный декремент --i; префиксный декремент i--; i++i = i ii = i + 1 k = i++ * 2;k = i * 2; i = i + 1 k = ++i * 2;i = i + 1; k = i * 2 k = i-----j // i jj = j – 1; k = i – j; i = i - 1
Префиксный и постфиксный инкремент © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 15 int i = 10; i++; int i = 10; i++; CAT&T asm (gcc –S prog.c) movl $10, -4(%ebp) addl $1, -4(%ebp) movl $0, %eax movl $10, -4(%ebp) addl $1, -4(%ebp) movl $0, %eax int i = 10, k; k = i++ * 2; int i = 10, k; k = i++ * 2; movl $10, -4(%ebp) movl -4(%ebp), %eax addl %eax, %eax movl %eax, -8(%ebp) addl $1, -4(%ebp) movl $10, -4(%ebp) movl -4(%ebp), %eax addl %eax, %eax movl %eax, -8(%ebp) addl $1, -4(%ebp) int i = 10, k; k = ++i * 2; int i = 10, k; k = ++i * 2; movl $10, -4(%ebp) addl $1, -4(%ebp) movl -4(%ebp), %eax addl %eax, %eax movl %eax, -8(%ebp) movl $10, -4(%ebp) addl $1, -4(%ebp) movl -4(%ebp), %eax addl %eax, %eax movl %eax, -8(%ebp)
Операции присваивания © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 16 Класс Опер.ОписаниеПример Бинарная += присваивание вида: a = b; трактуется как a = a b; например: a += b; эквив. a = a + b; i += j; -=i -= j; *=i *= j; /=i /= j; %=i %= j;... j += 15j = j + 15 k /= x + y;k /= k / (x + y); k *= k;
Примеры операций присваивания © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 17 CAT&T asm (gcc –S prog.c) #include int main() { int k, y = 5, x = 6; k += x + y; } #include int main() { int k, y = 5, x = 6; k += x + y; } movl $5, -8(%ebp) movl $6, -12(%ebp) movl -8(%ebp), %eax movl -12(%ebp), %edx leal (%edx,%eax), %eax addl %eax, -4(%ebp) movl $5, -8(%ebp) movl $6, -12(%ebp) movl -8(%ebp), %eax movl -12(%ebp), %edx leal (%edx,%eax), %eax addl %eax, -4(%ebp) #include int main() { int k = 40; k *= k; } #include int main() { int k = 40; k *= k; } movl $40, -4(%ebp) movl -4(%ebp), %eax imull -4(%ebp), %eax movl %eax, -4(%ebp) movl $40, -4(%ebp) movl -4(%ebp), %eax imull -4(%ebp), %eax movl %eax, -4(%ebp)
Логический тип данного © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 18 Логический *, булев (англ. Boolean или logical data type) тип данных – базовый тип данных в информатике, допускающий два возможных значения, иногда называемых правдой (true) и ложью (false). Присутствует в подавляющем большинстве языков программирования как самостоятельная сущность или реализуется через целочисленный тип. В подавляющем большинстве языков за истину полагается единица, за ложь ноль. Pascal Boolean Pascal Boolean C++ bool C++ bool Ada Boolean Ada Boolean C99 bool C99 bool C89 int/short/char C89 int/short/char ЛОЖЬ ~ 0 ИСТИНА ~ не 0 *
Операции сравнения © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 19 Класс Опер.ОписаниеПример Бинарная < Меньше a < b > Больше a > b >= Больше или равно a >= b
Пример использования операций сравнения © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 20 C (prog.c)AT&T asm (gcc –S prog.c) #include int main() { int x = 10, k = 5; int j, m; j = x < k; m = x > k; } #include int main() { int x = 10, k = 5; int j, m; j = x < k; m = x > k; } movl $10, -4(%ebp) movl $5, -8(%ebp) movl -4(%ebp), %eax cmpl -8(%ebp), %eax // сравнить setl %al // al – один байт, треб. setl movzbl %al, %eax // преобразование movl %eax, -12(%ebp) movl -4(%ebp), %eax cmpl -8(%ebp), %eax setg %al movzbl %al, %eax movl %eax, -16(%ebp) movl $10, -4(%ebp) movl $5, -8(%ebp) movl -4(%ebp), %eax cmpl -8(%ebp), %eax // сравнить setl %al // al – один байт, треб. setl movzbl %al, %eax // преобразование movl %eax, -12(%ebp) movl -4(%ebp), %eax cmpl -8(%ebp), %eax setg %al movzbl %al, %eax movl %eax, -16(%ebp)
Типичные ошибки © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 21 #include int main() { int x = 10, y = 5, z = 7; int r; r = x < y < z; // = 1, а не 0 } #include int main() { int x = 10, y = 5, z = 7; int r; r = x < y < z; // = 1, а не 0 } Операции сравнения имеют ассоциативность "слева-направо". Это означает, что среди равных по приоритету операций сначала выполняется самая левая, потом вторая слева и т.д. Последней выполняется правая операция. x < y < z = (x < y) < z 1. x < y = 10 < 5 = 0 2. (x < y) < z = (10 < 5) < 7 = 0 < 7 = 1
Булева алгебра © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 22 * Булевой алгеброй называется непустое множество A с двумя бинарными операциями (конъюнкция и дизъюнкция), одной унарной операцией (отрицание) и двумя выделенными элементами: 0 (или Ложь) и 1 (или Истина) такими, что для всех a, b и c из множества A верны следующие аксиомы: ассоциативность коммутативность поглощение дистрибутивность комплементарность
Булева алгебра (аксиомы и свойства) © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 23 * ассоциативность коммутативность поглощение дистрибутивность комплементарность законы де Моргана Блейка-Порецкого идемпотентность двойное отрицание склеивание
Логические операции © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 24 Опер.Описание ! Логическое НЕ (отрицание) && Логическое И (конъюнкция) || Логическое ИЛИ (дизъюнкция) ab!aa && ba || b
Логическое НЕ (отрицание) © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 25 Опер.Описание ! Логическое НЕ && Логическое И || Логическое ИЛИ ab!a Операция отрицания используется для замены значения логического выражения на противоположное. Например: int x = 10, y, k; scanf("%d",&y); k = !(x = = y); // выколотая точка x
Логическое И (коньюнкция) © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 26 Опер.Описание ! Логическое НЕ && Логическое И || Логическое ИЛИ Логическая операция, по своему применению максимально приближенная к союзу «и». Результат будет истинным, если оба аргумента истинны. Например: int y, k; scanf("%d",&y); k = (0 < y) && (y < 10); // интервал 0 < y < 10 aba && b
Логическое И (аналогия с электрической схемой) © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 27
Логическое ИЛИ (дизъюнкция) © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 28 Опер.Описание ! Логическое НЕ && Логическое И || Логическое ИЛИ Логическая операция, по своему применению максимально приближенная к союзу «и». Результат будет истинным, если оба аргумента истинны. Например: int y, k; scanf("%d",&y); k = (0 >= y) || (y >= 10); // (-; 0] + [10;+) 010 aba || b
Логическое ИЛИ (аналогия с электрической схемой) © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 29