Бывает необходимо явно преобразовать значение одного типа в значение другого. Явное преобразование типа дает значение одного типа для данного значения другого типа. Например:
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; // запись приведения к типуПоскольку операция -> имеет больший приоритет, чем приведение, последнее выражение интерпретируется как
|
|
С помощью явного преобразования типа к указательным типам можно сымитировать, что объект имеет совершенно произвольный тип. Например:
any_type* p = (any_type*)&some_object;позволит работать посредством p с некоторым объектом some_object как с любым типом any_type.
Когда преобразование типа не необходимо, его следует избегать. Программы, в которых используется много явных преобразований типов, труднее понимать, чем те, в которых это не делается. Однако такие программы легче понимать, чем программы, просто не использующие типы для представления понятий более высокого уровня (например, программу, которая оперирует регистром устройства с помощью сдвига и маскирования, вместо того, чтобы определить подходящую struct и оперировать ею; см. #2.5.2). Кроме того, правильность явного преобразования типа часто критическим образом зависит от понимания программистом того, каким образом объекты различных типов обрабатываются в языке, и очень часто от подробностей реализации. Например:
int i = 1; char* pc = "asdf"; int* pi = &i; i = (int)pc; pc = (char*)i; // остерегайтесь: значение pc может измениться // на некоторых машинах // sizeof(int)