Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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

Условная операция

В языке С++ имеется одна тернарная операция - условная операция, которая имеет следующий формат:

Форма записи:

выражение1? выражение2: выражение3

Результат Выражения1 должен быть целого или плавающего типа или быть указателем. Он оценивается с точки зрения его эквивалентности 0. Если результат Выражения1 не равен 0, то вычисляется Выражение2 и его значение является результатом операции. Если результат Выражения1 равен 0, то вычисляется Выражение3 и его значение является результатом операции. Следует отметить, что вычисляется либо Выражение2, либо Выражение3, но не оба. Тип результата зависит от типов 2 и 3, следующим образом.

1. Если результат Выражения2 или Выражения3 имеет целый или плавающий тип (отметим, что их типы могут отличаться), то выполняются обычные арифметические преобразования. Типом результата является тип результата выражения после преобразования.

2. Если Выражение2 и Выражение3 имеют один и тот же тип структуры, объединения или указателя, то тип результата будет тем же самым типом структуры, объединения или указателя.

3. Если оба выражения имеют тип void, то результат имеет тип void.

4. Если одно выражение является указателем на объект любого типа, а другое является указателем на vold, то указатель на объект преобразуется к указателю на vold, который и будет типом результата.

5. Если одно выражение является указателем, а другое константным выражением со значением 0, то типом результата будет тип указателя.

Пример:

#include <stdio.h>

void main()

{

float a,b,c,max,m1;

printf("Введите а,b,с: ");

scanf("%f %f %f",&a,&b,&c);

max=(a>b)?a:b;

max=(max>c)?max:c;

printf("%f ",max);

}

Переменной max присваивается максимальное значение переменных a, b, c.

Пример: Расположить числа a,b,c в порядке убывания

#include <stdio.h>

void main()

{

float a,b,c,h;

printf("Введите a,b,c: ");

scanf("%f %f %f",&a,&b,&c);

a<b?h=a,a=b,b=h:h=0;

a<c?h=a,a=c,c=h:h=0;

b<c?h=b,b=c,c=h:h=0;

printf("a= %.3f b= %.3f c= %.3f ",a,b,c);

printf(" ПРОГРАММУ СОСТАВИЛ ИВАНОВ");

}

Самостоятельная проработка:

При выполнении операций происходят неявные преобразования типов в следующих случаях:

- при выполнении операций осуществляются обычные арифметические преобразования (которые были рассмотрены выше, см. #2.3);

- при выполнении операций присваивания, если значение одного типа присваивается переменной другого типа;

- при передаче аргументов функции.

Кроме того, в С++ есть возможность явного приведения значения одного типа к другому.

В операциях присваивания тип значения, которое присваивается, преобразуется к типу переменной, получающей это значение.

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

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

1)Преобразование целых типов со знаком.

а) Целое со знаком преобразуется к более короткому целому со знаком, посредством усечения старших битов.

б) Целое со знаком преобразуется к более длинному целому со знаком, путем размножения знака.

в) При преобразовании целого со знаком к целому без знака, целое со знаком преобразуется к размеру целого без знака и результат рассматривается как значение без знака.

г) Преобразование целого со знаком к плавающему типу происходит без потери информации, за исключением случая преобразования значения типа long int или unsigned long int к типу float, когда точность часто может быть потеряна.

2) Преобразование целых типов без знака.

а) Целое без знака преобразуется к более короткому целому без знака или со знаком путем усечения старших битов.

б) Целое без знака преобразуется к более длинному целому без знака или со знаком путем дополнения нулей слева.

в) Когда целое без знака преобразуется к целому со знаком того же размера, битовое представление не изменяется. Поэтому значение, которое оно представляет, изменяется, если знаковый бит установлен (равен 1), т.е. когда исходное целое без знака больше чем максимальное положительное целое со знаком, такой же длины.

г) Целые значения без знака преобразуются к плавающему типу, путем преобразования целого без знака к значению типа signed long, а затем значение signed long преобразуется в плавающий тип. Преобразования из unsigned long к типу float, double или long double производятся с потерей информации, если преобразуемое значение больше, чем максимальное положительное значение, которое может быть представлено для типа long.

3) Преобразования плавающих типов.

а) Величины типа float преобразуются к типу double без изменения значения.

б) Величины double и long double преобразуются к float c некоторой потерей точности. Если значение слишком велико для float, то происходит потеря значимости, о чем сообщается во время выполнения.

в) При преобразовании величины с плавающей точкой к целым типам она сначала преобразуется к типу long (дробная часть плавающей величины при этом отбрасывается), а затем величина типа long преобразуется к требуемому целому типу. Если значение слишком велико для long, то результат преобразования не определен.

г) Преобразования из float, double или long double к типу unsigned long производится с потерей точности, если преобразуемое значение больше, чем максимально возможное положительное значение, представленное типом long.

4) Преобразование типов указателя.

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

б) Указатель на тип void может быть преобразован к указателю на любой тип, и указатель на любой тип может быть преобразован к указателю на тип void без ограничений. Значение указателя может быть преобразовано к целой величине. Метод преобразования зависит от размера указателя и размера целого типа следующим образом:

- если размер указателя меньше размера целого типа или равен ему, то указатель преобразуется точно так же, как целое без знака;

- если указатель больше, чем размер целого типа, то указатель сначала преобразуется к указателю с тем же размером, что и целый тип, и затем преобразуется к целому типу.

5) Целый тип может быть преобразован к адресному типу по следующим правилам:

- если целый тип того же размера, что и указатель, то целая величина просто рассматривается как указатель (целое без знака);

- если размер целого типа отличен от размера указателя, то целый тип сначала преобразуется к размеру указателя (используются способы преобразования, описанные выше), а затем полученное значение трактуется как указатель.

6) Преобразования при вызове функции. Преобразования, выполняемые над аргументами при вызове функции, зависят от того, был ли задан прототип функции (объявление "вперед") со списком объявлений типов аргументов.

Если задан прототип функции и он включает объявление типов аргументов, то над аргументами в вызове функции выполняются только обычные арифметические преобразования.

Эти преобразования выполняются независимо для каждого аргумента. Величины типа float преобразуются к double, величины типа char и short преобразуются к int, величины типов unsigned char и unsigned short преобразуются к unsigned int. Могут быть также выполнены неявные преобразования переменных типа указатель. Задавая прототипы функций, можно переопределить эти неявные преобразования и позволить компилятору выполнить контроль типов.

1) Преобразования при приведении типов. Явное преобразование типов может быть осуществлено посредством операции приведения типов, которая имеет формат:

(ИмяТипа) Выражение

или альтернативная форма записи

ИмяТипа (Выражение)

В приведенной записи ИмяТипа задает тип, к которому должен быть преобразован операнд. Выражение преобразуется к указанному типу по правилам преобразования, изложенным выше. Фактически точный смысл операции приведения типов можно описать следующим образом: выражение как бы присваивается некоторой переменной указанного типа, которая затем используется вместо всей конструкции.

Например, библиотечная процедура sqrt ожидает аргумента типа double и выдаст бессмысленный ответ, если к ней по небрежности обратятся с чем-нибудь иным. таким образом, если N - целое, то выражение

sqrt((double) N)

до передачи аргумента функции sqrt преобразует N к типу double. (Отметим, что операция приведения типов преобразует значение N в надлежащий тип; фактическое содержание переменной N при этом не изменяется).

Пример:

int i=2; long l=2; double d; float f; d=(double)i * (double)l; f=(float)d;

В данном примере величины i,l,d будут явно преобразовываться к указанным в круглых скобках типам.

<== предыдущая лекция | следующая лекция ==>
Операция sizeof | Функциональные подсистемы ЭИС
Поделиться с друзьями:


Дата добавления: 2014-01-15; Просмотров: 473; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.011 сек.