Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1_Типы.doc
Скачиваний:
3
Добавлен:
10.02.2015
Размер:
165.89 Кб
Скачать

1.6 Преобразование типов

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

char c1=123;

char c2=261;

int i=2.34;

float f=5.678f;

Преобразование объектов типа int и его модификаций в объекты типа char состоит в отбрасывании всех байтов кроме младшего. Поэтому в первом случае компилятор создаст объект 123 типа char без всяких предупредительных сообщений, а во втором случае он создаст объект 5 типа char и выведет сообщение об усечении (потере) старших байтов с указанием идентификатора и номера строки, которая его содержит. Преобразование объектов с плавающей точкой (типов float, double, long double) к типу int сопровождается потерей дробной части. Поэтому в третьем примере объект 2.34 типа double будет преобразован к объекту 2 типа int с выводом предупредительного сообщения о возможной потере точности. В последнем примере типы совпадают. Никаких сообщений от компилятора в этом случае не последует.

Язык Си позволяет программисту самому изменять тип обрабатываемых данных. Для этого имеются две операции. Если слово Type является идентификатором некоторого типа данных, то унарные операции, называемые преобразованиями типа, имеют вид

(Type)Операнд и Type(Операнд).

Они выполняют преобразование объекта, обозначенного словом Операнд, к типу Type. Нпример,

(char)123, char(261) или int(2.34).

Каждому типу данных в языке Си соответствует целое число, называемое его рангом. Если упорядочить типы данных по возрастанию их рангов, то получится следующий ряд

char, short, int, long int, float, double, long double

Беззнаковые типы имеют более высокий ранг, чем соответствующие типы со знаком. Если при компиляции программы будет обнаружена операция с разными типами операндов, то компилятор без дополнительных указаний со стороны программиста выполнит преобразование операндов к типу операнда с наивысшим рангом.

Программисты довольно часто применяют унарную операцию, обозначаемую словом sizeof и имеющую вид

sizeof (Операнд)

Она позволяет получить объем памяти в байтах, выделяемой компилятором для хранения Операнда, который может быть как типом данных, так и объектом любого типа.

При выборе имен рекомендуется начинать их с заглавных букв и снабжать префиксами, указывающими на их тип. Для справки в приводимой ниже табл. 1.6 приводятся префиксы некоторых часто используемых типов.

Таблица 1.6 - Префиксы для некоторых типов данных

Префикс

Тип данных

C

char

By

unsigned char

N

short int

I

int

W

unsigned short int

L

long int

Dw

unsigned long int

1.7 Выражения

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

0123, 0xf11, 123, 4.56, iNumber.

Предполагается, что идентификатор iNumber был определен ранее как переменная или константа. Во-вторых, любая конструкция из унарной операции + или - и следующего за ней выражения:

-123, +4.56, -iNumber.

В-третьих, конструкция из выражения, заключенного в круглые скобки:

(123), -(4.56), (+iNumber).

В-четвертых, конструкция из двух выражений и знака бинарной операции между ними:

(123+iNumber), (123+iNumber)*4.56<iNumber.

В выражениях, содержащих несколько операций, порядок их выполнения определяется круглыми скобками. Это означает, что в выражении

(a+b)*c

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

Таким образом, на основании изложенных правил можно утверждать, что в выражении

a+b*c

операции будут выполнены в порядке, указанном ниже

(a+(b*c)).

А в выражении

a+b*c-d/e,

содержащем операции с одинаковыми рангами, компилятор расставит скобки следующим образом

((a+(b*c))-(d/e)).

Таблица 1.7 - Приоритеты операций

Приоритет

Операции

Закон

ассоциативности

1

Преобразование типа()

слева направо

2

унарные -,+, !, ++, --, sizeof

так же

3

*, /, %

так же

4

5

+, -

так же

6

так же

7

<, <=, >, >=

так же

8

==, !=

так же

9

10

11

12

&&

так же

13

||

так же

14

?:

справа налево

15

=, *=, /=, +=, -=

так же

16

операция ,

слева направо

Это означает, что вначале будет выполнено умножение, затем деление, затем сложение и, наконец, вычитание.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]