- •1.2 Функции пользователя
- •1.2.1 Общие моменты
- •1.2.2 Изменение переменных в функции из других функций
- •1.2.3 Рекурсивные вызовы функций
- •1.2.4 Функции с переменным количеством параметров
- •1.2.5 Перегрузка функций
- •1.2.6 Передача функций в качестве параметров
- •1.3 Структуры
- •1.4 Битовые поля
- •1.5 Объединения
- •2 Оператор описания типа
- •3 Оператор описания объекта
- •3.1 Классы памяти
- •4 Преобразование типов
- •4.2.1 Неявные преобразования
- •4.2.2 Явные преобразования
- •5 Директивы препроцессора языка си
4 Преобразование типов
Значения могут быть преобразованы из одного типа в другой. Такое преобразование может быть неявным или явным.
4.2.1 Неявные преобразования
Применяются для согласования аргументов оператора или функции со значениями, которые предполагаются в этих операторах или функциях (при выполнении арифметических операций, при выполнении операций присваивания, если значение одного типа присваивается переменной другого типа, при передаче аргументов функции).
При этом:
char может быть преобразован в int, short int, long int.
int в – char, short int, long int (преобразование к целому большей длины включает расширение знакового разряда, преобразование к целому меньшей длины вызывает отбрасывание лишних старших разрядов). Также в float, double.
short – аналогичен типу int.
long – аналогичен типу int.
float – double, также int, short, long (машинно-зависимое преобразование, если преобразуемое значение слишком велико, то результат не определен).
double – float, а также int, short, long также как и float.
В операциях присваивания тип значения, которое присваивается, преобразуется к типу переменной, получающей это значение. Допускается преобразования целых и плавающих типов, даже если такое преобразование ведет к потере информации.
В арифметических операциях. Арифметические операторы в языке СИ преобразуют операнды к соответствующим типам автоматически, если операнды не имели таких типов с самого начала. Схема преобразования называется обычными арифметическими преобразованиями. Она может быть описана следующими правилами:
Операнды типов char и short преобразуется к типу int, операнды типа float преобразуется к типу double.
Если хотя бы один из операндов имеет тип double, то и другой операнд преобразуется к типу double, результат имеет тип double.
Если хотя бы один операнд имеет тип long, то и другой операнд преобразуется к типу long, результат имеет тип long.
Если хотя бы один операнд имеет тип unsigned, то и другой операнд преобразуется к типу unsigned, результат имеет тип unsigned.
Если ни один из случаев перечисленных выше не имеет место, то оба операнда должны иметь тип int, такой же тип будет и у результата.
Преобразования при вызове функции. Преобразования, выполняемые над аргументами при вызове функции, зависят от того, был ли задан прототип функции (объявление "вперед") со списком объявлений типов аргументов.
Если задан прототип функции и он включает объявление типов аргументов, то над аргументами в вызове функции выполняются только обычные арифметические преобразования.
4.2.2 Явные преобразования
Выражение E может быть явно преобразовано к типу имя_типа при помощи оператора:
(имя_типа) E;
Пример:
int i=2; long l=2; double d; float f; d=(double)i * (double)l; f=(float)d;
В данном примере величины i,l,d будут явно преобразовываться к указанным в круглых скобках типам.
Все типы могут быть явно преобразованы в тип void, однако тип void нельзя преобразовать в какой-либо другой тип. Также такие преобразования не реализованы для struct и union.