Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры теория 113019.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
379.66 Кб
Скачать

21. Преобразование типов (явное и неявное). Приведение типа

В операциях могут участвовать операнды различных типов, в этом случае они преобразуются к общему типу в порядке увеличения их "раз­мера памяти", необходимой для хранения их значе­ний. Поэтому неявные преобразования всегда идут от "меньших" объектов к "большим". Схема выполнения преобразований операндов арифметиче­ских операций:short, char int -> unsigned -> long -> double. float -> double Стрелки отмечают преобразования даже однотипных операндов пе­ред выполнением операции, т.е. действуют следующие правила: - значения типов charw short всегда преобразуются в int, -если любой из операндов (а или b) имеет тип double, то второй пре­образуется в double;

-если один из операндов long, то другой преобразуется в long. Внимание! Результатом 1/3 будет «О», чтобы избежать такого рода ошибок необходимо явно изменять тип хотя бы одного операнда, т.е. за­писывать, например: 1. / 3. Типы char и int могут свободно смешиваться в арифметических вы­ражениях. Каждая переменная типа char автоматически преобразуется в int, что обеспечивает значительную гибкость при проведении определен­ных преобразований символов. При присваивании значение правой части преобразуется к типу ле­вой, который и является типом результата. При некорректном использовании операций присваивания могут возникнуть неконтролируемые ошибки. Так, при преобразовании int в char старший байт просто отбрасывается.

Пусть имеются значения: float х; int i; тогда х=i; и i=х; приводят к преобразованиям, причем float преобразуется в int отбрасыванием дроб­ной части.

Тип double преобразуется во float округлением.Длинное целое преобразуется в более короткое целое и char по­средством отбрасывания лишних бит более высокого порядка.При передаче данных функциям также происходит преобразование типов: в частности, char становится int, a float - double.

Операция приведения типа В любом выражении преобразование типов может быть осуществле­но явно, для этого достаточно перед выражением поставить в скобках идентификатор соответствующего типа.Вид записи операции: (тип) выражение] ее результат - значение выражения, преобразованное к заданному типу. Операция приведения типа вынуждает компилятор выполнить ука­занное преобразование, но ответственность за последствия возлагается на программиста. Рекомендуется использовать эту операцию в исключи­тельных случаях, например:float х;int п=6, /с=4;

х=(л+/с)/3; -> х=3, т.к. дробная часть будет отброшена; x=(float)(n+k)/3\ х=3.333333 - использование операции приведения типа позволяет избежать округления результата деления целочисленных операндов.

22. Использование модификаторов при декларации типов данных

Ключевые слова int, float, char тд. называют конечными атрибутами декларации объектов программы. При декларации производных объектов используют еще дополнительные – промежуточные атрибуты «модификаторы».

К символам модификации текущего типа относятся:– символ * перед идентификатором, обозначающий декларацию указателя на объект исходного типа (левый промежуточный атрибут);– символы [ ] после идентификатора объекта – декларация массива объектов;– символы ( ) после идентификатора объекта – декларация функции (правые промежуточные атрибуты).Допускается использование более одного модификатора типа с учетом следующих правил:

1) чем ближе модификатор к ID объекта, тем выше его приоритет; 2) при одинаковом расстоянии от идентификатора объекта модифи­ка­торы [ ] и ( ) обладают приоритетом перед атрибутом звездочка *; 3) дополнительные круглые скобки позволяют изменить приоритет объединяемых ими элементов описания; 4) квадратные и круглые скобки, имеющие одинаковый приоритет, рассматриваются слева направо.

Конечный атрибут декларации принимается во внимание в последнюю очередь, т.е. тогда, когда все промежуточные атрибуты уже проинтерпре­ти­рованы. Примеры декларации объектов с конечным атрибутом int:

int a; – переменная типа int; int a[5]; – массив из пяти элементов типа int; int *a; – указатель на объект типа int; int **a; – указатель на указатель на объект типа int; int *a[5]; – массив из пяти указателей на элементы типа int; int (*a)[10]; – указатель на массив из десяти элементов типа int;

int *a[3][4]; – 3-элементный массив указателей на одномерные целочисленные массивы по четыре элемента каждый; int a[5][2]; – двухмерный массив элементов типа int; int a(void); – функция без параметров, возвращающая значение типа int; int *a(void); – функция без параметров, возвращающая указатель на элемент типа int; int (*a)(void); – указатель на функцию без параметров, возвраща­ю­щую значение типа int; int *a(void)[6]; – функция без параметров, возвращающая указатель на массив элементов типа int; int *a [4](void); – массив указателей на функцию без параметров, возвращающую значение типа int. Существуют и недопустимые последовательности промежуточных атрибутов, например, массив не может состоять из функций, а функция не может возвращать массив или другую функцию.