Выражения и операторы С++.ppt
- Количество слайдов: 87
Выражения и операторы
Выражения • Для вычисления значений используются выражения, которые состоят из операндов, знаков операций и скобок. • Операнды задают данные для вычислений. • Операции задают действия, которые необходимо выполнить. • Каждый операнд является, в свою очередь, выражением или одним из его частных случаев, например, константой или переменной.
Выражения • Операции выполняются в соответствии с приоритетами. • Для изменения порядка выполнения операций используются круглые скобки. Уровень их вложенности не ограничен. • Язык С++ предоставляет в наше распоряжение внушительный набор операций: арифметические, логические, поразрядные, операции отношения, выделения памяти, преобразования типа, выбора и т. д.
Простейшие операции С++ Операция ++ -sizeof -++ ! + (<тип>) Краткое описание Унарные операции постфиксный инкремент постфиксный декремент размер объекта или типа префиксный декремент префиксный инкремент логическое отрицание унарный минус унарный плюс преобразование типа
Простейшие операции С++ Операция Краткое описание Бинарные и тернарная операции * умножение / деление % остаток от деления + сложение вычитание < меньше <= меньше или равно > больше >= больше или равно == равно
Простейшие операции С++ Операция != && || ? : = *= /= %= += -= , Краткое описание не равно логическое ИЛИ условная операция (тернарная) присваивание умножение с присваиванием деление с присваиванием остаток отделения с присваиванием сложение с присваиванием вычитание с присваиванием последовательное вычисление
Приоритет операций 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ( ) [ ] -> : : . ! (не) + - (унарные) ++ -- &(адрес) *(указатель) sizeof new delete. * ->* Выбор члена косвенный */% + - (бинарные) << >> < <= > >= == != &(поразрядное и) ^(исключающее или) | (поразрядное или) && || ? : = *= /= %= += -= &= ^= |= <<= >>= ,
Выражения Операции одинакового приоритета выполняются: – унарные операции, условная операция и операции присваивания выполняются справа налево! – остальные - слева направо a=b=c a+b+c означает a = (b = c) ( a + b) + c Результат вычисления выражения характеризуется значением и типом.
Выражения В С++ различаются так называемые Lзначения (L-value) и R-значения (R-value). Название произошло от операции присваивания: – выражение, являющееся L -значением (от слова Left - левый), может располагаться как с левой, так и с правой стороны операции присваивания; – выражение, являющееся R -значением (от слова Right - правый), может располагаться только с правой, но никак не с левой стороны операции присваивания.
Выражения • Выражения возвращают в качестве результата либо L -значения, либо R значения. • Переменная - частный случай L -значения, а константа - частный случай R -значения. • Более общим случаем R -значения является обычное арифметическое выражение. • L -значением в общем случае может быть не только переменная, но и некоторое выражение, ссылающееся на область памяти.
Операции присваивания могут использоваться в программе как законченные операторы. К операциям они относятся потому, что могут использоваться в выражениях и формируют результат своего выполнения. Формат операции простого присваивания ( = ): операнд_1 = операнд_2 Левым операндом должно быть L значение, а правым - любое выражение.
Операции присваивания с = a + ( b = 5 ); // эквивалентно b=5; c=a+b; a = b = c; // эквивалентно b=c; a=b; a=(b=s/k)+n; // эквивалентно b=s/k; a=b+n; a=b=c=d=e+2; // эквивалентно d=e+2; c=d; b=c; a=b;
Операции присваивания • В составных операциях присваивания при вычислении выражения, стоящего в правой части, используется и L -значение из левой части. • *= /= %= += -= &= ^= |= <<= >>= int k; k=8; k*=3; // результат 24 k+=7; // результат 31
Операции присваивания a += 5 ; // эквивалентно a=a+5; a /= b; // эквивалентно a= a/b; b[i] *=n; // эквивалентно b[i]=b[i]*n; (a=b)+=c; // эквивалентно a=b; a=a+c; // a=b - является L -значением
Операции инкремента и декремента Имеют две формы записи – префиксную, ++<операнд>, - - < операнд >, и постфиксную < операнд >++ < операнд > - В префиксной форме сначала изменяется операнд на 1, и новое значение является результатом операции. В постфиксной форме значением выражения является исходное значение операнда, после чего он изменяется на 1.
Операции инкремента и декремента Выражения с инкрементом и декрементом можно сделать самостоятельным оператором, задав после выражения точку с запятой. a=5; i=3; c=a*++i; // результат операции с = 20, i=4 i=j=0; k=i++; // результат операции k=0, i=1 l=++j; // результат операции L=1, j=1 --j; // результат операции j=0 l++; // результат операции L=2
Арифметические операции делятся на: – унарные «+» и «-» ; – бинарные: сложение «+» , вычитание «-» , умножение «*» , деление «/» , получение остатка целочисленного деления «%» . • При делении двух целых чисел – результат целый. • Операция остаток от деления выполняется над целыми (!) 5/2 результат 2 5%2 результат 1
Логические операции К логическим операциям относятся: – !– логическое «не» – отрицание; – &&– логическое «и» – конъюнкция; – || – логическое «или» – дизъюнкция. 6>2&&3==3 !(6>2&&3==3) x!=0 && 20/x<5
Операции отношения <, <=, >, >=, ==, != Операнды могут быть арифметического типа или указателями. Результатом операции является значение true или false. Операции сравнения на равенство и неравенство имеют меньший приоритет, чем остальные операции сравнения. int a = 5; int b = 3; a > b // результат true a == b // результат false
Логические поразрядные операции Выполняются в битовых представлениях целых чисел: ~– поразрядная инверсия битов ( «не» ) &– поразрядная конъюнкция ( «и» ) битов |– поразрядная дизъюнкция ( «или» ) битов ^– поразрядное исключающее «или» битов Например: 6&5 // результат 4 6|5 // результат 7 6^5 // результат 3
Сдвиги – >> – сдвиг вправо битового представления целого числа на количество разрядов, задаваемое правым целочисленным операндом, – << – сдвиг влево битового представления целого числа на количество разрядов, задаваемое левым целочисленным операндом. Например: 4<<2 // результат 16: 00000100 << 00010000 5>>1 // результат 2: 00000101 >> 00000010
Тернарная или условная операция Тернарная операция, т. е. операция с тремя операндами, имеет форму : операнд_1 ? операнд_2 : операнд_3 Операнды вычисляются слева направо. Результат вычисления первого операнда должен быть типа, который можно преобразовать к типу bool. Если результат равен true, то результатом выполнения всей условной операции будет значение второго операнда, иначе - третьего операнда.
Тернарная или условная операция i = ( i < n ) ? i + 1 : 1; x < 0 ? –x : x; max = a <= b ? b : a; a < b ? a : b = c * x + d; y = x == 0 ? 1 : 0; minimum = (a < b) ? a : b; status=(age >= 18) ? "adult" : "minor";
Операция следования • Символом операции следования является , (запятая). • Выражения, разделенные этим символом, выполняются слева направо строго в том порядке, в котором они перечислены. • Вычисление левого выражения обязательно завершается до того, как начнется вычисление правого выражения.
Операция следования int a=3, b=8, c; //запятая – разделитель, а не операция; c = a++, a+b; // результат: а = 4, с = 12; (b--, c)*=3; // результат: b = 7, с = 36. int m=5, z; z=(m=m*5, m*3); // результат: m=25, z=75 int d, k; k=(d=4, d*8); // результат: d=4, k=32 с=(a=5, b=a*a); // эквивалентно a=5; b=a*a; c=b;
Стандартные математические функции • В выражениях можно применять стандартные математические функции из библиотеки math. • При их использовании необходимо подключить файл прототипов функций math. h: #include
Стандартные математические функции • • fabs(< Вещественное выражение>) abs(<Целое выражение>) sqrt(<Вещественное выражение>) exp(<Вещественное выражение>) log 10(< Вещественное выражение >) sin(<Вещественное выражение>) cos(<Вещественное выражение>)
Стандартные математические функции • atan(<Вещественное выражение>) • tan(< Вещественное выражение >) • acos(< Вещественное выражение >) • asin(< Вещественное выражение >) • sinh(<Вещественное выражение>) • cosh(<Вещественное выражение>) В файле conio. h: • Rand () – генерация случайного числа • Srand (<Целое число>) – инициализация генератора случайных чисел.
Преобразования базовых типов • В выражение могут входить операнды различных типов. • Если операнды имеют одинаковый тип, то результат операции будет иметь тот же тип. • Если операнды разного типа, перед вычислениями автоматически выполняются неявные преобразования типов. • Обычно короткие типы приводятся к более длинным, что обеспечивает сохранение значимости и точности: ( char, short ) -> int -> unsigned int -> long -> unsigned long -> float -> double -> long double
Преобразования базовых типов • Если один из операндов имеет тип long double, второй приводится к этому же типу в любом случае. • Если в выражении нет операндов long double, но есть операнд double, все double преобразуется к этому типу. • В том случае, если нет операндов типа double и long double, но есть операнд float, float тип остальных операндов меняется на float.
Преобразования базовых типов • Если у нас нет вещественных операндов, значит, все они представляют собой целые типы. • Прежде чем определить тип результата, производится преобразование, называемое приведением к целому: все операнды с типом меньше, чем int, заменяются на int.
Преобразования базовых типов • При приведении к целому типы char, signed char, unsigned char и short int преобразуются в int. • Тип unsigned short int трансформируется в int, если этот тип достаточен для представления всего диапазона значений unsigned short int, в противном случае unsigned short int заменяется на unsigned int. • Тип wchar_t и перечисления приводятся к наименьшему целому типу, способному представить все их значения.
Преобразования базовых типов • После приведения к целому сравниваются получившиеся типы операндов. • Если один из них имеет тип unsigned long, long то остальные будут того же типа. • Если в выражении нет объектов unsigned long, но есть объекты типа long, тип long остальных операндов меняется на long. • Преобразование unsigned int в long происходит только в том случае, если тип long способен вместить весь диапазон значений unsigned int.
Преобразования базовых типов • Если же тип long не способен представить весь диапазон unsigned int, оба операнда приводятся к unsigned long. • В случае отсутствия операндов типов unsigned long и long, используется тип unsigned int. • Если же нет операндов и этого типа, то к int.
Преобразования базовых типов • В логических операциях и условной операции выполняется неявное преобразование к типу bool. • При этом любое значение, не равное нулю (даже отрицательное), трактуется как true, а нуль считается false. • При обратных преобразованиях величин типа bool к целому типу значение true преобразуется в целую константу 1, а значение false - в 0.
Преобразования базовых типов • Однако в выражениях с операцией присваивания встречается и обратный вариант, когда более "объемный" тип присваивается менее "объемному", например, float в int. • Подобные преобразования связаны с потерей информации (дробная часть отбрасывается), поэтому называются сужающими приведениями (преобразованиями). Компилятор предупреждает о таких операциях.
Явное преобразование типа Операция преобразования типа (часто называемая приведением типа) может записываться в двух эквивалентных формах: ( тип ) выражение тип ( выражение ) (unsigned long)(x/3+2); (long)25; (unsigned char)123; int(3. 14) результат: 3 float(2/3) результат: 0. 0 int(’A’) результат: 65
Простейшие средства ввода/вывода • В языке С++ нет встроенных средств ввода/вывода - он осуществляется с помощью средств, содержащихся в стандартных библиотеках. • Для ввода/вывода данных скалярных типов и строк обычно используют стандартные функции ввода/вывода, описанные в библиотеке stdio. h.
Простейшие средства ввода/вывода В библиотеке существуют три вида функций, организующих элементарный ввод с клавиатуры и вывод на экран: – форматный ввод/вывод – для выполнения операций ввода/вывода над скалярными значениями, символами и строками; – ввод/вывод строк; – ввод/вывод символов.
Простейшие средства ввода/вывода • Ввод чисел, символов и строк с клавиатуры: int scanf(<Форматная строка>, <Список адресов переменных>); // возвращает //количество введенных значений или EOF(-1) • Вывод чисел, символов и строк на экран: int printf(<Форматная строка>, <Список выражений>); // возвращает // количество выведенных байтов
Простейшие средства ввода/вывода Форматная строка – это строка, которая помимо символов содержит управляющие спецификации вида: % [-] [<Целое 1>] [. <Целое 2>] <Формат> где «-» – выравнивание по левой границе, <Целое 1> – ширина поля вывода; <Целое 2> – количество цифр дробной части числа; <Формат> – формат для ввода/вывода значения.
Простейшие средства ввода/вывода #include
Простейшие средства ввода/вывода #include
Простейшие средства ввода/вывода #include
Простейшие средства ввода/вывода #include
Простейшие средства ввода/вывода #include
Простейшие средства ввода/вывода Ввод строк с клавиатуры: char* gets(<Строковая переменная>); // возвращает копию строки или NULL Вывод строк на экран с переходом на следующую строку: int puts (<Строковая константа или переменная>); puts(″Это строка″); gets(st);
Простейшие средства ввода/вывода Ввод символов с клавиатуры: int getchar(); // возвращает символ или EOF Вывод символов на экран: int putchar(<Символьная переменная или константа>); ch=getchar(); putchar('t');
Простейшие средства ввода/вывода • Частью стандартной библиотеки С++ является библиотека iostream, которая реализована как иерархия классов и обеспечивает базовые возможности ввода/вывода. • Ввод с терминала, называемый стандартным вводом, “привязан” к предопределенному объекту cin. Вывод на cin терминал, или стандартный вывод, привязан к объекту cout
Простейшие средства ввода/вывода #include
Блок операторов используется в конструкциях ветвления, выбора и циклов, предусматривающих один оператор. Формат: { <Оператор>; … <Оператор>; } Пример: Точка с запятой в отличие { от Паскаля является частью оператора, а f=a+b; потому не может a+=10; опускаться перед фигурной скобкой. }
Условный оператор имеет полную и сокращенную форму. if ( выражение ) оператор_1; [else оператор_2; ] Вычисляется выражение, которое может иметь арифметический тип или тип указателя. Если оно не равно нулю, выполняется первый оператор, иначе - второй. Управление передается на оператор, следующий за условным.
Условный оператор Если в какой-либо ветви требуется выполнить несколько операторов, их необходимо заключить в блок. Блок может содержать любые операторы, в том числе описания и другие условные операторы. if (a<0) b = 1; if (a++) b++; if (ad || a==0)) b++; else {b* = a; a = 0; }
Условный оператор if (aa) max = b; else max = a; // max = (b > a) ? b : a; if (int i = fun(t)) a –= i; else a += i; if ((c=a+b)!=5) c+=b; else c=a; if ( x*x + y*y < 1 ) kol = 2; else if ( x*x + y*y < 4 ) kol = 1; else kol = 0;
Условный оператор Правило вложенности. При записи двух вложенных операторов if с одной альтернативной ветвью возникает неоднозначность: не понятно, которому из двух операторов if принадлежит альтернативная ветвь. Для разрешения коллизии используют правило вложения: вложения else всегда относится к ближайшему if.
Условный оператор if (<Условие 1> ) if <Условие 2> <Действие 1> else <Действие 2> if <Условие 1> { if <Условие 2> <Действие 1> } else <Действие 2>
Оператор switch ( выражение ){ case константное_выражение_1: [список_операторов_1] case константное_выражение_2: [список_операторов_2]. . . case константное_выражение_n: [список_операторов_n] [default: операторы ] }
Оператор switch • Вычисляется выражение, записанное после switch, результат выражения switch должен быть целого типа или его значение приводится к целому; • Полученное значение последовательно сравнивается с константами, которые записаны следом за case • При первом же совпадении выполняются операторы помеченные данной меткой.
Оператор switch • Если выполненные операторы не содержат оператора перехода (break или return), то return далее выполняются операторы всех следующих вариантов, пока не появится оператор перехода или не закончится переключатель. • Если значение выражения, записанного после switch не совпало ни с одной константой, то выполняются операторы, которые следуют за меткой default • Метка default может отсутствовать.
Оператор switch The number is one 2*2=1 i=1 3*3=1 #include
Оператор switch (n_day) n_day от 1 до 5 { Go work! n_day= 6 case 1: Clean the yard and relax! case 2: n_day=7 case 3: relax! case 4: case 5: puts("Go work!"); break; case 6: printf("%s", "Clean the yard "); case 7: puts("relax!"); }
Оператор switch #include
Оператор цикла while (<Выражение>) <Оператор>; где <Выражение> – определяет условие выполнения цикла (тип выражения должен быть арифметическим или приводимым к нему ); <Оператор> – любой оператор С++, в том числе блок операторов. Цикл выполняется до тех пор, пока результат выражения отличен от нуля, т. е. «Истина» . Истина Если условие нарушено сразу при входе в цикл, то тело цикла не выполнится ни разу.
Оператор цикла while #include
Оператор цикла while #include
Оператор цикла while Вычислить сумму ряда #include
Оператор цикла do while do <Оператор > while (<Выражение>) ; Сначала выполняется простой или составной оператор, составляющий тело цикла, а затем вычисляется выражение. Если оно не равно 0 (истинно), тело цикла истинно выполняется еще раз, и так далее, пока выражение не станет равным нулю. Тип выражения должен быть арифметическим или приводимым к нему.
Оператор цикла do while #include
Оператор цикла do while #include
Оператор цикла do while #include
Оператор цикла for ( инициализация; выражение; модификации) оператор; Инициализация используется для объявления и присвоения начальных значений величинам, используемым в цикле. В этой части можно записать несколько операторов, разделенных запятой. Выражение определяет условие выполнения цикла: если оно не равно 0 (истинно), цикл выполняется.
Оператор цикла for ( инициализация; выражение; модификации) оператор; Модификации выполняются после каждой итерации цикла и служат обычно для изменения параметров цикла. В части модификаций можно записать несколько операторов через запятую. Простой или составной оператор представляет собой тело цикла. Любая из частей оператора for может быть опущена (но точки с запятой надо оставить на своих местах!).
Оператор цикла for #include
Оператор цикла for #include
Оператор цикла for(int i=0, float s=0; i
Оператор цикла for #include
Оператор цикла for #include
Операторы передачи управления В С++ есть пять операторов, изменяющих естественный порядок выполнения вычислений: • оператор выхода из цикла и переключателя break; break • оператор перехода к следующей итерации цикла continue; • оператор возврата из функции return; • оператор безусловного перехода goto; • оператор генерации исключения throw.
Оператор досрочного завершения break • Оператор используется в операторах циклов и выбора: for, while, do. . . while, switch для выхода из конструкции до ее завершения. • Он записывается в виде: break; • Оператор break обеспечивает переход на оператор, непосредственно следующий за оператором if, switch или цикла, внутри которых находится оператор break. • Оператор не может обеспечить выход сразу из двух и более вложенных циклов или блоков.
Оператор досрочного завершения break #include
Оператор досрочного завершения break while ( cin >> in. Buf ) { switch( in. Buf[ 0 ] ) { case '-': for ( int ix = 1; ix < in. Buf. size(); ++ix ) { if ( in. Buf[ ix ] == ' ' ) break; // #1 //. . . } break; // #2 case '+': //. . . } }
Оператор continue • Оператор перехода к следующей итерации цикла continue пропускает все операторы, оставшиеся до конца тела цикла, и передает управление на начало следующей итерации. • Он записывается в виде: continue; • Инструкция continue завершает выполнение только текущей итерации. • Инструкция continue может быть использована только внутри цикла.
Оператор continue #include
Оператор return • Оператор возврата из функции return завершает выполнение функции и передает управление в точку ее вызова. • Вид оператора: return [ выражение ]; • Выражение должно иметь скалярный тип. Если тип возвращаемого функцией значения описан как void, выражение должно отсутствовать.
Оператор return #include
Оператор безусловного перехода goto • goto метка; • В теле той же функции должна присутствовать ровно одна конструкция вида: метка: оператор; • Оператор goto передает управление на помеченный оператор. • Метка – это обычный идентификатор, областью видимости которого является функция, в теле которой он встречается. • Использование этих операторов усложняет «чтение» программы и свидетельствует о ее непродуманной структуре.
Оператор генерации исключения throw • Исключительную ситуацию (или просто исключение) генерирует либо программист с помощью оператора throw, либо сама среда выполнения. • Это происходит, когда во время выполнения программы возникают какие-либо ошибки, ошибки например, деление на ноль или переполнение. • Механизм обработки исключений, реализованный в С++, позволяет реагировать на подобные ошибки и таким образом избегать аварийного завершения программы.