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