
Лекция-04-05.ppt
- Количество слайдов: 22
Язык программирования С Тема «Типы данных, операции и выражения» (продолжение) Лекция 16. 09. 13 г. 1
Обзор вопросов прошлой лекции ü ü ü ü ü Строковые константы Константы перечислимого типа Объявления переменных Операции, виды операций Арифметические операции Операции отношения Логические операции Операции инкремента и декремента Поразрядные (битовые) операции Лекция 16. 09. 13 г. 2
Операция присваивания В языке С операция присваивания существенно отличается от аналогичной операции в других языках: Присваивание a = b действительно является операцией (а не оператором), т. е. после завершения этой операции получается некоторое значение (в данном примере – значение переменной b), которое может быть использовано для последующих вычислений. Следовательно, присваивание может применяться внутри выражений, наряду с другими операциями. //Ex 008. c – иллюстрация операции присваивания #include
Операции, совмещенные с присваиванием Кроме обычного присваивания существует ещё 10 модификаций, в которых присваивание совмещается с какой-либо бинарной операцией, например, k += 2 эквивалентно k = k + 2, или ещё: x >>= 1 эквивалентно x = x >> 1 и т. д. Полный перечень бинарных операций, совмещаемых с присваиванием: + - * / % << >> & ^ | //Ex 009. c – подсчет количества единичных битов в двух байтах #include
Тернарная условная операция Во многих алгоритмах часто встречается конструкция вида: if (условие) x = <выраж 1>; else x = <выраж 2>; Иными словами, переменная x получает значение одного из двух выражений, в зависимости от истинности условия. В языке С для компактной записи такого фрагмента существует специальная тернарная условная операция: x = условие ? <выраж 1> : <выраж 2> //Ex 010. c – иллюстрация условной операции #include
Приоритет и ассоциирование операций № Операции Ассоциирование Кол-во 1 () [] ->. → 4 2 ! ~ ++ -- + - * & (тип) sizeof ← 12 3 * / % → 3 4 + - → 2 5 << >> → 2 6 < <= > >= → 4 7 == != → 2 8 & → 1 9 ^ → 1 10 | → 1 11 && → 1 12 || → 1 13 ? : ← 1 14 = += -= *= /= %= &= ^= |= <<= >>= ← 11 15 , → 1 Всего операций: 47 Лекция 16. 09. 13 г. 6
Приоритет и ассоциирование операций Операции, находящиеся в одной строке таблицы, принадлежат одной группе, т. е. имеют одинаковый приоритет и одинаковый порядок выполнения (слева направо или наоборот). Все 47 операций распределены по 15 группам, группа 1 имеет наивысший приоритет, а группа 15 – наиболее низкий приоритет. 1 -я группа: () - вызов функции, [] – доступ к элементу массива, -> - обращение к элементу структуры через указатель, . - обращение к элементу структуры через имя структуры. 2 -я группа (унарные операции): + - - унарные «плюс» и «минус» , * «разыменование» указателя, т. е. обращение к объекту, на который он указывает, & - получение адреса объекта, (тип) – преобразование типа операнда к заданному типу, sizeof – определение размера объекта. … 15 -я группа: , - операция «запятая» - это бинарная операция, имеющая вид: выражение 1 , выражение 2. Действие операции заключается в последовательном вычислении выражений, а её результатом является значение второго выражения. Лекция 16. 09. 13 г. 7
Иллюстрация к операциям //Ex 011. c – иллюстрация операции «запятая» #include
Иллюстрация к приоритету операций Чему равно значение переменной y после вычисления выражения: y*=x+=--k<<++i 5 4 2 3 1 //Ex 012. c – иллюстрация сложного выражения #include
Преобразование (приведение) типов Приведение типа (type conversion) — преобразование значения одного типа в значение другого типа. Различают явное и неявное приведения типов. üпри явном приведении с помощью унарной операции (тип) указывается тип, к которому необходимо преобразовать значение выражения, расположенного справа от этой операции; üпри неявном приведении преобразование происходит автоматически, по правилам, установленным в языке программирования. //Ex 013. c – иллюстрация приведения типов int main() { int x = 32768, y = 65535; short sx = 32768, sy = 65535; char c 1 = 32768, c 2 = 65535; unsigned z = 0 xffff; float fz = 0 xffff; printf("%d %d %d %f %dn", x, (short)x, sx, (float)x, c 1); printf("%d %d %d %f %dn", y, (short)y, sy, (float)y, c 2); printf("%u %f %f %fn", z, (float)z, (double)z, fz); system("PAUSE"); return 0; } Лекция 16. 09. 13 г. 10
Преобразование (приведение) типов Корректными преобразования типов, не вызывающими искажения значений или потери точности, являются приведения более «узких» типов к более «широким» . Если же значение более «широкого» типа приводится к более «узкому» типу, возможно искажение значения или потеря точности, о чем выдает предупреждение (warning) компилятор. Явные преобразования типов всегда происходят по «инициативе» программиста, а инициатором неявных преобразований выступает компилятор в тех случаях, когда при выполнении операции ожидается один тип, а фактически требуется другой тип. Замечание. В некоторых случаях неявное преобразование бывает неосуществимым «по определению» . Например, в выражении 3. 0%2. 0 значения 3. 0 и 2. 0 не преобразуется автоматически к целому типу, т. к. операция % применима только к целочисленным значениям и поэтому компилятор выдаст сообщение об ошибке (error). Лекция 16. 09. 13 г. 11
Тема «Управляющие конструкции языка С» Лекция 16. 09. 13 г. 12
Простые операторы и блоки ; Ø Если в конце любого выражения поставить символ (точка с запятой), получим элементарную «строительную конструкцию» программы – простой оператор: z = foo(x+y); x += y; 4*5; … Ø Простые операторы в программе могут располагаться последовательно, друг за другом: temp = x+y; z = foo(temp); Ø Последовательность операторов любого вида можно заключить в фигурные скобки { и }. В этом случае получится составной оператор, или, иначе – блок, который синтаксически эквивалентен простому оператору и компилируется как самостоятельная конструкция. После закрывающей скобки точка с запятой не ставится. Ø Блок может быть пустым: {} Лекция 16. 09. 13 г. 13
Простые операторы и блоки Ø Внутри блока можно размещать объявления переменных: { int temp = x+y; z = foo(temp); } Такие переменные будут локальными; они создаются при входе в блок и исчезают при выходе из блока. За пределами блокальные переменные невидимы. Локальные переменные размещаются в области памяти, которая называется стек. Ø Блоки могут быть вложенными, при этом глубина вложенности не ограничивается: { int temp = x+y; z = foo(temp); { float temp 2 = x∗y; z += bar(temp 2); } } Лекция 16. 09. 13 г. 14
Операторы простого выбора условие ≠ 0 оператор условие В простейшем варианте выбора требуется выбрать для выполнения определенный оператор, если некоторое условие =0 истинно (т. е. его значение отлично от 0). Это записывается так: if (условие) оператор Например: if(x%2) y += x/2; Т. е. если x – нечетно, то y увеличивается, в противном случае ничего не делается. Если при выполнении условия нужно выполнить последовательность операторов, необходимо использовать блок =0 ≠ 0 оператор1 оператор2 В другом случае требуется выбрать для выполнения один из двух операторов, в зависимости от некоторого условия: if (условие) оператор1 else оператор2 Например: if (a>b) c=a; else c=b; Лекция 16. 09. 13 г. 15
Вложенные операторы выбора Если в качестве исполняемого оператора в операторе выбора используется другой оператор выбора, возникает ситуация вложенности операторов выбора. Пример: найти: d = max(a, b, c) a>b =0 ≠ 0 a>c =0 b>c ≠ 0 d=a =0 ≠ 0 d=c d=b d=c Лекция 16. 09. 13 г. //Ex 014. c #include
Вложенные операторы выбора Модифицируем алгоритм: d=c a>b =0 ≠ 0 a>c ≠ 0 d=a =0 b>c ≠ 0 d=b … if (a>b) {if (a>c) d = a; } else if (b>c) d = b; =0 //Ex 015. c #include
Множественный выбор Фрагмент алгоритма программы «Калькулятор» : c==‘+’ =0 c==‘-’ ≠ 0 r = a-b r = a+b =0 c==‘*’ =0 c==‘/’ ≠ 0 r = a*b r = a/b =0 Ошибка! … if (c==‘+’) r = a + b; else if (c==‘-’) r = a - b; else if (c==‘*’) r = a * b; else if (c==‘/’) r = a / b; else printf(“error!n"); … Лекция 16. 09. 13 г. 18
Оператор множественного выбора switch Для алгоритмов с множественным выбором существует специальный оператор: =0 c==‘+’ c==‘-’ ≠ 0 r = a+b r = a-b =0 c==‘*’ =0 c==‘/’ ≠ 0 r = a*b r = a/b =0 Ошибка! … switch(c){ case '+': r = a + b; break; case '-': r = a - b; break; case '*': r = a * b; break; case '/': r = a / b; break; default: printf(“error!n"); } … Лекция 16. 09. 13 г. 19
Важное замечание! При отсутствии операторов break реализуется совсем другой алгоритм: … switch(c){ case '+': r = a + b; case '-': r = a - b; case '*': r = a * b; case '/': r = a / b; default: printf(“error!n"); } … c==‘+’ ≠ 0 r = a+b =0 c==‘-’ ≠ 0 r = a-b =0 c==‘*’ =0 c==‘/’ ≠ 0 r = a*b r = a/b =0 Лекция 16. 09. 13 г. Ошибка! 20
Оператор множественного выбора switch Общий вид оператора switch: switch (выражение) { case констант-выраж 1: операторы case констант-выраж 2: операторы … default: операторы } Действие оператора: вычисляется значение выражения, которое затем последовательно сравнивается со значениями константных выражений в блоках case. Если произошло совпадение значений, выполняются операторы соответствующего блока case. Как правило, последним оператором в каждом блоке case является оператор break ( «прервать» ) и поэтому по завершению выбранного case-блока вычислительный процесс выходит за пределы оператора switch. Если совпадения значений не произошло ни для одного из case-блоков, то выполняются операторы блока default (если он есть) или вычислительный процесс сразу выходит за пределы оператора switch. Лекция 16. 09. 13 г. 21
Иллюстрация оператора switch //Ex 017. c - статистика #include