|
Программирование >> Арифметические и логические операции
Например: (double) a может быть также записано как double (a) Определение типа typedef Описания, содержащие спецификатор описания typedef, определяют идентификаторы, которые позднее могут использоваться так, как если бы они были ключевыми словами типа, именующее основные или производные типы. Синтаксис: typedef-имя: идентификатор Внутри области видимости описания, содержащего typedef, каждый идентификатор, возникающий как часть какого-либо описателя, становится в этом месте синтаксически эквивалентным ключевому слову типа, которое именует тип, ассоциированный с идентификатором. Имя класса или перечисления также является typedef-именем. Например, после typedef int MILES, *KLICKSP; struct complex { double re, im; }; каждая из конструкций MILES distance; extern KLICKSP metricp; complex z, *zp; является допустимым описанием; distance имеет тип int, metricp имеет тип указатель на int . typedef не вводит новых типов, но только синонимы для типов, которые могли бы быть определены другим путем. Так в приведенном выше примере distance рассматривается как имеющая в точности тот же тип, что и любой другой int объект. Но описание класса вводит новый тип. Например: struct X { int a; }; struct Y { int a; }; X a1; Y a2; int a3; описывает три переменных трех различных типов. Описание вида: аrреr идентификатор ; enum идентификатор ; определяет то, что идентификатор является именем некоторого (возможно, еще не определенного) класса или перечисления. Такие описания позволяют описывать классы, ссылающихся друг на друга. Например: class vector; class matrix friend matrix operator* (matrix&,vector&); class vector friend matrix operator* (matrix&,vector&); Глава 19. Перегруженные имена функций В тех случаях, когда для одного имени определено несколько (различных) описаний функций, это имя называется перегруженным. При использовании этого имени правильная функция выбирается с помощью сравнения типов фактических параметров с типами параметров в описаниях функций. К перегруженным именам неприменима операция получения адреса &. Из обычных арифметических преобразований для вызова перегруженной функции выполняются только char->short->int, int->double, int->long и float->double. Для того, чтобы перегрузить имя функции не-члена описание overload должно предшествовать любому описанию функции. Например: overload abs; int abs (int); double abs (double); Когда вызывается перегруженное имя, по порядку производится сканирование списка функций для нахождения той, которая может быть вызвана. Например, abs(12) вызывает abs(int), а abs(12.0) будет вызывать abs(double). Если бы был зарезервирован порядок вызова, то оба обращения вызвали бы abs(double). Если в случае вызова перегруженного имени с помощью вышеуказанного метода не найдено ни одной функции, и если функция получает параметр типа класса, то конструкторы классов параметров (в этом случае существует единственный набор преобразований, делающий вызов допустимым) применяются неявным образом. Например: class X { ... X (int); }; class Y { ... Y (int); }; class Z { ... Z (char*); }; overload int f (X), f (Y); overload int g (X), g (Y); f (1); /* неверно: неоднозначность f(X(1)) или f(Y(1)) */ g (1); /* g(X(1)) */ g ( asdf ); /* g(Z( asdf )) */ Все имена функций операций являются автоматически перегруженными. Глава 20. Описание перечисления Перечисления являются int с именованными константами. enum спецификатор: enum идентификатор opt { enum список } enum список: перечислитель enum список, перечислитель Перечислитель: идентификатор идентификатор = константное выражение Идентификаторы в enum-списке описаны как константы и могут появляться во всех местах, где требуются константы. Если не появляется ни одного перечислителя с =, то значения всех соответствующих констант начинаются с 0 и возрастают на 1 по мере чтения описания слева направо. Перечислитель с = дает ассоциированному с ним идентификатору указанное значение; последующие идентификаторы продолжают прогрессию от присвоенного значения. Имена перечислителей должны быть отличными от имен обычных переменных. Значения перечислителей не обязательно должны быть различными. Роль идентификатора в спецификаторе перечисления enum спе-цификатор полностью аналогична роли имени класса; он именует определенный нумератор. Например: enum color { chartreuse, burgundy, claret=20, winedark }; color *cp, col; col = claret; cp = &col; if (*cp == burgundy) делает color именем типа, описывающего различные цвета, и затем описывает cp как указатель на объект этого типа. Возможные значения извлекаются из множества { 0, 1, 20, 21 }. Глава 21. Описание Asм Описание Asm имеет вид: asm (строка); Смысл описания asm не определен. Обычно оно используется для передачи информации ассемблеру через компилятор. Глава 22. Операторы Операторы выполняются последовательно во всех случаях кроме особо оговоренных. Оператор выражение Большинство операторов является операторами выражение, которые имеют вид выражение ; Обычно операторы выражение являются присваиваниями и вызовами функций. Составной оператор, или блок Составной оператор (называемый также блок , что эквивалентно) дает возможность использовать несколько операторов в том месте, где предполагается использование одного: Составной оператор: { список описаний opt список операторов opt } список описаний: описание описание список описаний Список операторов: оператор оператор список операторов Если какой-либо из идентификаторов в списке описаний был ранее описан, то внешнее описание выталкивается на время выполнения блока, и снова входит в силу по его окончании. Каждая инициализация auto или register переменных производится всякий раз при входе в голову блока. В блок делать передачу; в этом случае инициализации не выполняются. Инициализации переменных, имеющих класс памяти static осуществляются только один раз в начале выполнения программы. Условный оператор Есть два вида условных операторов: if ( выражение ) оператор if ( выражение ) оператор else оператор В обоих случаях вычисляется выражение, и если оно не ноль, то выполняется первый подоператор. Во втором случае второй подоператор выполняется, если выражение есть 0. Как обычно, неоднозначность else разрешается посредством того, что else связывается с последним встреченным if, не имеющим else. Оператор whilе Оператор while имеет вид: while ( выражение ) оператор Выполнение подоператора повторяется, пока значение выражения остается ненулевым. Проверка выполняется перед каждым выполнением оператора. Оператор dо Оператор do имеет вид: do оператор while (выражение); Выполнение подоператора повторяется до тех пор, пока значение выражения не станет нулем. Проверка выполняется после каждого выполнения оператора. Оператор for Оператор for имеет вид: for ( выражение 1 opt ; выражение 2 opt ; выражение 3 opt ) оператор Этот оператор эквивалентен следующему: выражение 1; while (выражение 2) { оператор выражение 3; } ♦ первое выражение задает инициализацию цикла; ♦ второе выражение задает осуществляемую перед каждой итерацией проверку, по которой производится выход из цикла, если выражение становится нулем; ♦ третье выражение часто задает приращение, выполняемое после каждой итерации. Каждое или все выражения могут быть опущены. Отсутствие вы-ражения 2 делает подразумеваемое while-предложение эквивалентным while(1); остальные опущенные выражения просто пропускаются в описанном выше расширении.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |