что такое неявное и явное приведение типов

Приведение типа

Приведе́ние ти́па (type conversion) — преобразование значения переменной одного типа в значение другого типа. Выделяют явное и неявное приведения типов.

Содержание

Неявное приведение

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

Каждый раз при выполнени операции сравнения или присваивания переменные разных типов будут приведены к единому типу. Следует с осторожностью использовать неявное приведение типа. При переводе числа из вещественного типа в целочисленный, дробная часть отсекается. Обратное приведение из целочисленного типа к вещественному также может привести к понижению точности, что связано с различным представлением вещественных и целочисленных чисел на машинном уровне. К примеру, вещественный тип single стандарта IEEE 754 не может точно представить число 16777217, в то время как 32-битный целочисленный тип может. Это может привести к ситуациям, когда сравнение на равенство одного и того же числа, представленного типами (int и single) будет выдавать ложный результат (числа не равны друг другу).

Явное приведение типа

В языке C

Для явного приведения типов некоторой переменной перед ней следует указать в круглых скобках имя нового типа, например:

В языке C++

В языке C++ существует четыре разновидности приведения типа. Все четыре типа записываются в виде

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

static_cast

dynamic_cast

const_cast

reinterpret_cast

См. также

что такое неявное и явное приведение типов. Смотреть фото что такое неявное и явное приведение типов. Смотреть картинку что такое неявное и явное приведение типов. Картинка про что такое неявное и явное приведение типов. Фото что такое неявное и явное приведение типов

Полезное

Смотреть что такое «Приведение типа» в других словарях:

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

Понижающее приведение — В объектно ориентированном программировании, понижающее приведение (англ. downcasting) или «уточнение типа» (англ. type refinement) акт приведения типа, ссылающегося на базовый класс, к одному из его производных классов. В… … Википедия

Санкт-Петербургская психиатрическая больница специализированного типа с интенсивным наблюдением — Санкт Петербургская психиатрическая больница (стационар) специализированного типа с интенсивным наблюдением … Википедия

Динамическая идентификация типа данных — Не следует путать с динамической типизацией. Динамическая идентификация типа данных (англ. Run time type information, Run time type identification, RTTI) механизм в некоторых языках программирования, который позволяет определить тип… … Википедия

Динамическая идентификация типа — данных (англ. Run time Type Information, Run time Type Identification, RTTI) механизм, реализованный в языках программирования, который позволяет определить тип данных переменной или объекта во время выполнения программы. Содержание 1 Реализация … Википедия

ГОСТ 22615-77: Система «человек-машина». Выключатели и переключатели типа «Тумблер». Общие эргономические требования — Терминология ГОСТ 22615 77: Система «человек машина». Выключатели и переключатели типа «Тумблер». Общие эргономические требования оригинал документа: 1. Выключатель (переключатель) типа «Тумблер» выключатель (переключатель),… … Словарь-справочник терминов нормативно-технической документации

Сравнение C Sharp и Java — Правильный заголовок этой статьи Сравнение C# и Java. Он показан некорректно из за технических ограничений. Сравнения языков программирования Общее сравнение Основной синтаксис Основные инструкции Массивы Ассоциативные массивы Операции со… … Википедия

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

Валютный тип — Тип данных Содержание 1 История 2 Определение 3 Необходимость использования типов данных … Википедия

Типизация данных — Тип данных фундаментальное понятие теории программирования. Тип данных определяет множество значений, набор операций, которые можно применять к таким значениям, и, возможно, способ реализации хранения значений и выполнения операций. Любые… … Википедия

Источник

Приведение типов

Будучи на конференции Qt Developer Days 2010 я узнал, что одним из самых популярных вопросов на собеседовании в разные зарубежные компании, работающие с Qt библиотекой, является вопрос о различиях в способах приведения типов в C++. Поэтому здесь я рассмотрю основные различия между static_cast, dynamic_cast, const_cast, reinterpret_cast, C-style cast, qobject_cast и qvariant_cast

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

Используется для динамического приведения типов во время выполнения. В случае неправильного приведения типов для ссылок вызывается исключительная ситуация std::bad_cast, а для указателей будет возвращен 0. Использует систему RTTI (Runtime Type Information). Безопасное приведение типов по иерархии наследования, в том числе для виртуального наследования.

Пожалуй самое простое приведение типов. Снимает cv qualifiers — const и volatile, то есть константность и отказ от оптимизации компилятором переменной. Это преобразование проверяется на уровне компиляции и в случае ошибки приведения типов будет выдано сообщение.

Приведение типов без проверки. reinterpret_cast — непосредственное указание компилятору. Применяется только в случае полной уверенности программиста в собственных действиях. Не снимает константность и volatile. применяется для приведения указателя к указателю, указателя к целому и наоборот.

Си-шный метод приведения типов. Пожалуй самый нежелательный способ приведения типов. Страуструп пишет:
«Например, что это значит выражение — x = (T)y;. Мы не знаем. Это зависит от типа T, типов x и y. T может быть названием типа, typedef или может быть параметр template-а. Может быть, х и у являются скалярными переменными и Т представляет собой значение преобразования. Может быть, х объекта класса, производного от класса Y и Т — нисходящее преобразование. По этой причине программист может не знать, что он делает на самом деле.»
Вторая причина нежелательного использования приведения типов в C-style — трудоемкость процесса поиска мест приведения типов.

Приводит объект QObject* к типу TYPE если объект типа объекта TYPE или тип наследует от TYPE иначе возвращает 0. qobject_cast от 0 также дает 0. Необходимое условие. Класс должен наследовать от QObject и содержать в себе макрос Q_OBJECT. Функция ведет себя аналогично стандартному dynamic_cast, но при этом не использует RTTI. Вот как описана данная функция в Qt 4.7.0:

Итак, что тут происходит:

Во-первых если не определены QT_NO_MEMBER_TEMPLATES (определяется только в том случае, если используется версия Microsoft Visual Studio ниже 2002) и QT_NO_QOBJECT_CHECK (определяется в случае использования версии Microsoft Visual Studio ниже 2003), то происходит проверка наличия макроса Q_OBJECT в объявлении класса. И после этого выполняется непосредственно само преобразование — сначала получаем статический объект класса QMetaObject, который называется staticMetaObject, у которого вызывается метод cast, который возвращает const_cast переданного ему объекта, попутно проверяя наследуется ли данный объект от QObject. Далее полученному объекту делается static_cast и возвращается результат.

Приводит объект класса QVariant к нужному классу. Функция аналогична функции qVariantValue.

Рассмотрим, что происходит внутри:

В первой секции кода производится получение идентификатора класса через метасистему Qt. В том случае если класс не зарегистрирован через Q_DECLARE_METATYPE, компиляция кода с приведением к этому типу выдаст ошибку. Далее, если тип объекта, полученный от метасистемы совпадает с типом в значении QVariant, производится reinterpret_cast содержимого объекта, если идентификатор класса не является встроенным типом и его id не совпадает с заложенным в значении QVariant, то возвращается TYPE(). Для случаев, когда мы приводим к встроенному типу, вызывается функция qvariant_cast_helper, которая вызывает в свою очередь функцию convert, адрес которой хранится в структуре Handler. В ней уже осуществляется приведение способом подходящим для типа TYPE. Если конвертация не удалась возвращается объект TYPE()

UPD: Спасибо BaJlepa:
1. const_cast также умеет добавлять cv-квалификаторы
2. для преобразования указателей лучше использовать двойной static_cast через void* вместо reinterpret_cast, потому как такое преобразование позволяет быть уверенным в том, что только pointer-ы участвуют в приведении

Источник

что такое неявное и явное приведение типов. Смотреть фото что такое неявное и явное приведение типов. Смотреть картинку что такое неявное и явное приведение типов. Картинка про что такое неявное и явное приведение типов. Фото что такое неявное и явное приведение типов

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

Проверь себя

Вот список интересных выражений, о которых мы только что говорили:

Тут полно такого, что выглядит более чем странно, но без проблем работает в JS, задействуя неявное приведение типов. В подавляющем большинстве случаев неявного приведения типов в JS лучше всего избегать. Рассматривайте этот список как упражнение для проверки ваших знаний о том, как работает приведение типов в JavaScript. Если же тут для вас ничего нового не нашлось — загляните на wtfjs.com.

что такое неявное и явное приведение типов. Смотреть фото что такое неявное и явное приведение типов. Смотреть картинку что такое неявное и явное приведение типов. Картинка про что такое неявное и явное приведение типов. Фото что такое неявное и явное приведение типов
JavaScript полон странностей

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

Неявное преобразование типов — палка о двух концах: это источник путаницы и ошибок, но это и полезный механизм, который позволяет писать меньше кода без потери его читабельности.

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

Первая особенность работы с типами в JS, о которой нужно знать, заключается в том, что здесь есть только три вида преобразований:

Примитивные типы данных

▍Преобразование к типу String

Все примитивные типы преобразуются в строки вполне естественным и ожидаемым образом:

В случае с типом Symbol дело несколько усложняется, так как значения этого типа можно преобразовать к строковому типу только явно. Здесь можно почитать подробности о правилах преобразования типа Symbol.

▍Преобразование к типу Boolean

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

▍Преобразование к типу Number

Неявное приведение значения к числовому типу — тема более сложная, так как оно применяется, пожалуй, чаще чем преобразование в строку или в логическое значение. А именно, преобразование к типу Number выполняют следующие операторы:

Вот как в числа преобразуются примитивные значения:

Вот два особых правила, которые стоит запомнить:

При применении оператора == к null или undefined преобразования в число не производится. Значение null равно только null или undefined и не равно ничему больше.

Значение NaN не равно ничему, включая себя. В следующем примере, если значение не равно самому себе, значит мы имеем дело с NaN

Преобразование типов для объектов

Вот псевдо-реализация метода [[ToPrimitive]] :

В целом, работа алгоритма выглядит следующим образом:

Вот пример поведения Date при преобразовании типов:

Стандартные методы toString() и valueOf() можно переопределить для того, чтобы вмешаться в логику преобразования объекта в примитивные значения.

Метод Symbol.toPrimitive ES6

Разбор примеров

Вооружённые теорией, вернёмся к выражениям, приведённым в начале материала. Вот каковы результаты вычисления этих выражений:

Разберём каждый из этих примеров.

▍true + false

Оператор + с двумя операндами вызывает преобразование к числу для true и false :

▍12 / ‘6’

▍«number» + 15 + 3

▍15 + 3 + «number»

▍[1] > null

Оператор сравнения > выполняет числовое сравнение [1] и null :

▍«foo» + + «bar»

▍’true’ == true и false == ‘false’

▍[] + null + 1

Логические операторы || и && в процессе работы приводят значение операндов к логическому типу, но возвращают исходные операнды (которые имеют тип, отличный от логического). Значение 0 ложно, а значение ‘0’ истинно, так как является непустой строкой. Пустой объект <> так же преобразуется к истинному значению.

▍[1,2,3] == [1,2,3]

Этот пример лучше объяснить пошагово в соответствии с порядком выполнения операций.

▍new Date(0) — 0

▍new Date(0) + 0

Итоги

Преобразование типов — это один из базовых механизмом JavaScript, знание которого является основой продуктивной работы. Надеемся, сегодняшний материал помог тем, кто не очень хорошо разбирался в неявном преобразовании типов, расставить всё по своим местам, а тем, кто уверенно, с первого раза, никуда не подсматривая, смог решить «вступительную задачу», позволил вспомнить какой-нибудь интересный случай из их практики.

Уважаемые читатели! А в вашей практике случалось так, чтобы путаница с неявным преобразованием типов в JavaScript приводила к таинственным ошибкам?

Источник

Приведение типов в Java

что такое неявное и явное приведение типов. Смотреть фото что такое неявное и явное приведение типов. Смотреть картинку что такое неявное и явное приведение типов. Картинка про что такое неявное и явное приведение типов. Фото что такое неявное и явное приведение типов

что такое неявное и явное приведение типов. Смотреть фото что такое неявное и явное приведение типов. Смотреть картинку что такое неявное и явное приведение типов. Картинка про что такое неявное и явное приведение типов. Фото что такое неявное и явное приведение типов

что такое неявное и явное приведение типов. Смотреть фото что такое неявное и явное приведение типов. Смотреть картинку что такое неявное и явное приведение типов. Картинка про что такое неявное и явное приведение типов. Фото что такое неявное и явное приведение типов

1. Приведение типов

что такое неявное и явное приведение типов. Смотреть фото что такое неявное и явное приведение типов. Смотреть картинку что такое неявное и явное приведение типов. Картинка про что такое неявное и явное приведение типов. Фото что такое неявное и явное приведение типов

Можно присваивать друг другу переменные разных типов. При этом значение, взятое из переменной одного типа, будет преобразовано в значение другого типа и присвоено второй переменной. В связи с этим можно выделить два вида преобразования типов: расширение и сужение.

Расширение типа похоже на перекладывание из маленькой корзинки в большую — операция проходит незаметно и безболезненно. Сужение типа — это перекладывание из большой корзинки в маленькую: места может не хватить, и что-то придётся выбросить.

Вот типы, отсортированные по размеру «корзинки»:

что такое неявное и явное приведение типов. Смотреть фото что такое неявное и явное приведение типов. Смотреть картинку что такое неявное и явное приведение типов. Картинка про что такое неявное и явное приведение типов. Фото что такое неявное и явное приведение типов

2. Расширение типов

Часто может возникнуть необходимость присвоить переменной одного числового типа значение переменной другого числового типа. Как же это сделать?

В Java есть 4 целочисленных типа:

ТипРазмер
byte1 байт
short2 байта
int4 байта
long8 байт

Переменной большего размера всегда можно присваивать переменные меньшего размера.

КодОписание
Этот код отлично скомпилируется.

А что насчет вещественных чисел?

С ними все аналогично — размер имеет значение:

ТипРазмер
float4 байта
double8 байт

Обратите внимание, что преобразование к вещественному типу может привести к потере точности из-за нехватки значащих цифр.

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

3. Сужение типов

Представьте, что переменная — это корзина. У нас есть корзины разных размеров: 1, 2, 4 и 8 байт. При перекладывании пирожков из меньшей корзины в большую проблем не будет. А вот при перекладывании из большей в меньшую часть пирожков может потеряться.

При сужении типа мы должны явно показать компилятору, что мы не ошиблись, и отбрасывание части числа сделано осознанно. Для этого используется оператор приведения типа. Это имя типа в круглых скобочках.

В таких ситуациях Java-компилятор требует от программиста указывать оператор преобразования типа. Выглядит в общем виде он так:

КодОписание
Каждый раз нужно явно указывать оператор преобразования типа

Устройство чисел в памяти:

ТипДвоичная записьДесятичная запись
int0b 00000000 00001111 01000010 010000001,000,000
short0b 01000010 0100000016,960
byte0b 0100000064

Тип char

4. Тип выражения

А что делать, если в одном выражении используются переменные разных типов? Логичный ответ – их сначала нужно преобразовать к общему типу. Но какому?

Конечно же, к большему.

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

КодОписание
a будет расширена до типа long и только затем произойдет сложение.

Числа с плавающей точкой

Если в выражении участвуют целое число и число с плавающей точкой ( float / double ), целое число будет преобразовано в число с плавающей точкой ( float / double ), и только потом будет выполнена операция над ними.

Тому есть несколько причин. Примеры:

В общем случае при умножении числа длиной в 8 бит (1 байт) на число длиной в 8 бит (1 байт), мы получим число длиной 16 бит (2 байта)

5. Важный нюанс

Операция приведения типа имеет довольно высокий приоритет.

Поэтому если в выражении есть, допустим, сложение и операция приведения типа, она будет выполнена до сложения.

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

Источник

Явные и неявные преобразования (Visual Basic)

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

Ключевые слова преобразований

В следующей таблице приведены доступные ключевые слова для преобразования.

При преобразовании в составной тип данных интерфейсы, которые он реализует, и классы, от которых он наследует

Функция CType

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

CType — Это Встроенная функция, то есть скомпилированный код выполняет преобразование, часто без создания вызова функции. Это повышает производительность.

Сравнение CType с другими ключевыми словами преобразования типов см. в разделе Оператор DirectCast и Оператор TryCast.

Простые типы

Составные типы

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

Типы массивов

CType также может преобразовывать типы данных массива, как показано в следующем примере.

Дополнительные сведения и пример см. в разделе Преобразование массивов.

Типы, определяющие CType

Можно определить CType для класса или структуры, которые вы определили. Это позволяет преобразовать значения в тип класса или структуры и из него. Дополнительные сведения и пример см. в разделе инструкции. Определение оператора преобразования.

Значения, используемые с ключевым словом преобразования, должны быть допустимыми для целевого типа данных, иначе возникает ошибка. Например, при попытке преобразовать в Long объект Integer значение Long должно находиться в пределах допустимого диапазона для Integer типа данных.

При указании CType преобразования из одного типа класса в другой происходит сбой во время выполнения, если исходный тип не является производным от целевого типа. Такой сбой приводит к InvalidCastException возникновению исключения.

Выполнение явного преобразования также называется приведением выражения к заданному типу данных или классу объекта.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *