Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на C / C++ / Основы программирования на Си.doc
Скачиваний:
362
Добавлен:
02.05.2014
Размер:
1.3 Mб
Скачать

Операция приведения

Самое лучшее - это вообще избегать преобразования типов, особенно в порядке убывания ранга. Но иногда оказывается удобным применять такие преобразования при условии, что мы ясно представляем смысл выполняемых действий. Преобразования типов, которые мы обсуждали до сих пор, выполнялись автоматически. Существует возможность точно указывать тип данных, к которому необходимо привести величину. Этот способ называется приведением типов, и используется следующим образом: перед данной величиной в круглых скобках записывается имя требуемого типа. Скобки и имя типа вместе образуют операцию приведения. В общем виде она записывается так:

(тип)

где фактическое имя требуемого типа представляется вместо слова тип.

Рассмотрим пример:

int nice;

nice = 1.6+1.7;

nice = (int)1.6+(int)1.7;

В первом примере используется автоматическое преобразование типов. Сначала числа 1.6 и 1.7 складываются - результат равен 3.3. Затем путем отбрасывания дробной части полученное число преобразуется в 3 для согласования с типом intпеременнойnice. Во втором примере 1.6 и 1.7 преобразуются в целые числа 1, так что переменной nice присваивается значение, равное 1+1, или 2.

Особенности работы с языком Си. Мы не должны смешивать типы; вот почему в некоторых языках это запрещено. Но бывают ситуации, когда это оказывается полезным. Философия языка Си заключается в том, чтобы не устанавливать барьеров на вашем пути, но при этом возложить на вас всю ответственность за злоупотребление предоставленной свободой.

Неявное преобразование типа

Неявные преобразования типа выполняются главным образом для согласования аргументов оператора или функции (если это возможно) со значениями, предполагаемыми в этих операторах или функциях. Все неявные преобразования типа, которые могут встретиться, перечислены ниже (слева указывается преобразуемый тип, а справа - список типов, в которые он может быть преобразован):

char-int,shortint,longint(Преобразование к значению с большим числом двоичных разрядов может включать, а может не включать расширение знакового разряда - это зависит от реализации языка. Для элементов заданного набора знаков гарантируется преобразование в неотрицательные целые значения).

int-char,shortint,longint(Преобразование к целому большей длины включает расширение знакового разряда. Преобразование к целому меньшей длины вызывает отбрасывание лишних старших разрядов).float,double,unsignedint(интерпретация комбинации битов в виде беззнакового целого значения).

shortint- аналогично типуint.

longint- аналогично типуint.

float-double,int,shortint,longint(машинно-зависимое преобразование, если преобразуемое значение слишком велико, то результат неопределен).

double-float(преобразование с округлением и последующим отбрасыванием лишних разрядов),int,shortint,longint.

Арифметические преобразования

Арифметические операторы языка Си преобразуют операнды к соответствующим типам автоматически, если операнды не имели таких типов с самого начала. Схема преобразования, используемая этими операторами, называется обычные арифметические преобразования; эта схема может быть описана следующими правилами:

Преобразовать операнды типов charиshortintк типуint; преобразовать операнды типаfloatк типуdouble.

Если хотя бы один из операндов имеет тип double, то и другой операнд преобразуется к типуdouble(если он другого типа); результат имеет типdouble.

Если хотя бы один операнд имеет тип long, то и другой операнд преобразуется к типуlong(если он другого типа); результат имеет типlong.

Если хотя бы один из операндов имеет тип unsigned, то и другой операнд преобразуется к типуunsigned(если его тип неunsigned); результат имеет типunsigned.

Если ни один из случаев 1-4 не имеет места, то оба операнда должны иметь тип int; такой же тип будет и у результата.