Основы программирования

Наследство от языка Си - Преобразование типа
Индекс материала
Наследство от языка Си
Область Видимости
Объекты и Адреса (Lvalue)
Имена
Типы
Неявное Преобразование Типа
Тип void
Указатели
Вектора
Структуры
Эквивалентность типов
Регистры
Константы
Символьные Константы
Строки
Const
Перечисления
Экономия Пространства
Упражнения
Выражения и Операторы
Программа синтаксического разбора
Функция ввода
Таблица имен
Обработка ошибок
Драйвер
Параметры командной строки
Краткая сводка операций
Порядок вычисления
Побитовые логические операции
Преобразование типа
Свободная память
Сводка операторов
Проверки
Goto
Комментарии и Выравнивание
Упражнения
Функции и Файлы
Компоновка
Заголовочные Файлы
Один Заголовочный Файл
Множественные Заголовочные Файлы
Сокрытие Данных
Файлы как Модули
Как Создать Библиотеку
Функции
ередача Параметров
Возврат Значения
Векторные Параметры
Параметры по Умолчанию
Перегрузка Имен Функций
Незаданное Число Параметров
Все страницы


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

Бывает необходимо явно преобразовать значение одного тпа в значение другого. Явное преобразование типа дает значние одного типа для данного значения другого типа. Например:

float r = float(1);

перед присваиванием преобразует целое значение 1 к знчению с плавающей точкой 1.0. Результат преобразования типа не является lvalue, поэтому ему нельзя присваивать (если только тип не является ссылочным типом).

Есть два способа записи явного преобразования типа: трдиционная в C запись приведения к типу (double)a и функцинальная запись double(a). Функциональная запись не может прменяться для типов, которые не имеют простого имени. Например, чтобы преобразовать значение к указательному типу надо или использовать запись преобразования типа

char* p = (char*)0777;


или определить новое имя типа:

typedef char* Pchar; char* p = Pchar(0777);

По моему мнению, функциональная запись в нетривиальных случаях предпочтительна. Рассмотрим два эквивалентных примера

Pname n2 = Pbase(n1-»tp)-»b_name; //функциональная запись Pname n3 = ((Pbase)n2-»tp)-»b_name; // запись приведения // к типу Поскольку операция -» имеет больший приоритет, чем прведение, последнее выражение интерпретируется как

((Pbase)(n2-»tp))-»b_name

С помощью явного преобразования типа к указательным тпам можно симитировать, что объект имеет совершенно проивольный тип. Например:

any_type* p = (any_type*) amp;some_object;

позволит работать посредством p с некоторым объектом some_object как с любым типом any_type.

Когда преобразование типа не необходимо, его следует ибегать. Программы, в которых используется много явных преоразований типов, труднее понимать, чем те, в которых это не делается. Однако такие программы легче понимать, чем программы, просто не использующие типы для представления понятий блее высокого уровня (например, программу, которая оперирует регистром устройства с помощью сдвига и маскирования, вместо того, чтобы определить подходящую struct и оперировать ею, см. #2.5.2). Кроме того, правильность явного преобразования типа часто критическим образом зависит от понимания програмистом того, каким образом объекты различных типов обрабатваются в языке, и очень часто от подробностей реализации. Например:

int i = 1; char* pc = «asdf»; int* pi = amp;i;

i = (int)pc; pc = (char*)i; // остерегайтесь! значение pc может изм//ниться // на некоторых машинах // sizeof(int)«sizeof(char*) pi = (int*)pc; pc = (char*)pi; // остерегайтесь! значение pc может изм// ниться // на некоторых машинах char* // представляется иначе, чем int*

На многих машинах ничего плохого не произойдет, но на других результаты будут катастрофическими. Этот код в лучшем случае непереносим. Обычно можно без риска предполагать, что указатели на различные структуры имеют одинаковое представлние. Кроме того, любой указатель можно (без явного преобразвания типа) присвоить void*, а void* можно явно преобразовать к указателю любого типа.

В С++ явное преобразование типа оказывается ненужным во многих случаях, когда C (и другие языки) требуют его. Во мнгих программах явного преобразования типа можно совсем избжать, а во многих других его применение можно локализовать в

небольшом числе подпрограмм.



 
Терморегуляторы бу - терморегулятор теплолюкс. Ищете терморегуляторы?