Студопедия

КАТЕГОРИИ:


Архитектура-(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

 

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

 

результатом операции j = 2, j = 1 будет 1,

результатом операции j = 2, j++ будет 2,

а результатом операции j = 2, ++j будет 3.

 

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

Операции, не рассмотренные в этом разделе, будут описаны по мере необходимости.

 

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

 

(char, short) -> int -> unsigned int ->

long -> unsigned long -> float ->

double -> long double

 

Это не означает, что преобразование типа int в double выполняется последовательно по цепочке, просто менее "объемный" тип преобразуется к более "объемному". Типы char и short перед выполнением операции обязательно преобразуются к int. Типом результата выражения обычно является самый "объемный" из типов операндов.

Однако в выражениях с операцией присваивания встречается и обратный вариант, когда более "объемный" тип присваивается менее "объемному", например, float в int. Подобные преобразования связаны с потерей информации (дробная часть отбрасывается), поэтому называются сужающими приведениями (преобразованиями). Компилятор предупреждает о таких операциях.

В логических операциях и условной операции выполняется неявное преобразование к типу bool. При этом любое значение, не равное нулю (даже отрицательное), трактуется как true, а нуль считается false. При обратных преобразованиях величин типа bool к целому типу значение true преобразуется в целую константу 1, а значение false – в 0.

Программист может задать явное преобразование типа. Операция преобразования типа (часто называемая приведением типа) в стиле С может записываться в двух эквивалентных формах:

 

(тип) выражение

тип (выражение)

 

Результатом операции является значение заданного типа, например:

 

int a = 2;

float b = 6.8;

printf("\n a = %lf b = %d", double (a), (int) b);

 

Величина a преобразуется к типу double, а переменная b – к типу int с отсечением дробной части (сужающее приведение). Результат работы программы: a = 2.000000 b = 6

 

Явное преобразование типа в стиле С оставлено в С++ только для совместимости. Использовать его не рекомендуется, поскольку оно слишком универсально, а потому чревато плохо диагностируемыми ошибками.

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

 

static_cast <тип> (выражение)

reinterpret_cast <тип> (выражение)

dynamic_cast <тип> (выражение)

const_cast <тип> (выражение)

 

В зависимости от вида преобразования необходимо использовать соответствующую ему операцию приведения типа. Приведение типа static_cast<T>(e) используется между родственными типами. Его может проверить компилятор. Операция reinterpret_cast выполняет преобразование типов без проверки при компиляции. Оно часто необходимо тогда, когда точно известно, что объекты разных типов занимают в памяти одинаковое количество байт и фактического преобразования делать как раз не нужно. Операция const_cast аннулирует действие модификатора const и применяется достаточно редко. Операция dynamic_cast выполняет преобразование во время работы программы и применяется для преобразования указателей и ссылок родственных полиморфных классов.

 




Поделиться с друзьями:


Дата добавления: 2015-04-30; Просмотров: 356; Нарушение авторских прав?; Мы поможем в написании вашей работы!


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



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




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