Студопедия
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

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

Читайте также:
  1. Вопрос 21.Преобразование муниципальных образований
  2. Основные формы ведения хозяйства. Преобразование форм собственности.
  3. Понятие и признаки банкротства. Управление и реструктуризация предприятия во время кризиса и банкротства. Санация, преобразование и ликвидация предприятий.
  4. Представление и преобразование информации в ЭВМ.
  5. Преобразование в системе управления экономикой и государством под началом Н.С. Хрущева.
  6. Преобразование Галилея в классической механике. Постулаты СТО и преобразования Лоренца. Следствия СТО.
  7. Преобразование десятичных чисел в двоичные
  8. Преобразование динамических рядов.
  9. Преобразование типов

 

 

Иногда бывает необходимо явно преобразовать значение одного типа в

значение другого. Результатом явного преобразования будет

значение указанного типа, полученное из значения другого типа.

Например:

 

float r = float(1);

 

Здесь перед присваиванием целое значение 1 преобразуется в значение

с плавающей точкой 1.0f. Результат преобразования типа не является

адресом, поэтому ему присваивать нельзя (если только тип не является

ссылкой).

Существуют два вида записи явного преобразования типа:

традиционная запись, как операция приведения в С, например, (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;

 

позволит обращаться к некоторому объекту (some_object) через указатель

p как к объекту произвольного типа (any_type). Тем не менее, если

some_object в действительности имеет тип не any_type, могут получиться

странные и нежелательные результаты.

Если преобразование типа не является необходимым, его вообще следует

избегать. Программы, в которых есть такие преобразования, обычно

труднее понимать, чем программы, их не имеющие. В то же время

программы с явно заданными преобразованиями типа понятнее,

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

не вводят типов для представления понятий более высокого уровня.

Так, например, поступают программы, управляющие регистром устройства с

помощью сдвига и маскирования целых, вместо того, чтобы определить

подходящую структуру (struct) и работать непосредственно с ней

(см. $$2.6.1). Корректность явного преобразования типа часто

существенно зависит от того, насколько программист понимает, как язык

работает с объектами различных типов, и какова специфика данной реализации

языка. Приведем пример:

 

int i = 1;

char* pc = "asdf";

int* pi = &i;

i = (int)pc;

pc = (char*)i; // осторожно: значение pc может измениться.

// На некоторых машинах sizeof(int)

// меньше, чем sizeof(char*)

pi = (int*)pc;

pc = (char*)pi; // осторожно: pc может измениться

// На некоторых машинах char* имеет не такое

// представление, как int*

 

Для многих машин эти присваивания ничем не грозят, но для некоторых

результат может быть плачевным. В лучшем случае подобная программа

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

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

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

типа) указателю типа void*, а void* может быть явно преобразован

обратно в указатель произвольного типа.

В языке С++ явные преобразования типа оказывается излишними во многих

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

программах можно вообще обойтись без явных преобразований типа, а во

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

 

 

Вопрос 10

 

10. Основные операции языка С, приоритеты.

 
Таблица 1.3.1.
Знак Математическая операция
* Умножение
/ Деление и целочисленное деление нацело
% Деление по модулю и остаток от деления
+ Сложение
- Вычитание

Знак / всегда означает деление. Однако если с обеих сторон от этого знака стоят целые величины (константы, переменные или их комбинации), он означает целочисленное деление. Если в результате такого деления получается остаток, С++ его отбрасывает.

Знак % означает выделение остатка при целочисленном делении. Эта операция требует, чтобы с обеих сторон от ее знака стояли целые величины.

Примеры.

cout << 10/2 << "\n>> // 5 (остатка нет)

cout << 300/100 << "\n"; // 3 (остатка нет)

cout << 10/3 << "\n"; // 3 (остаток отброшен)

cout << 300/165 << "\n>> // 1 (остаток отброшен)

cout << 10%3 << "\n>; // 1 (остаток)

cout << 20/4 "\n"; // 0 (остатка нет)




Дата добавления: 2015-01-30; просмотров: 72 | Поможем написать вашу работу | Нарушение авторских прав




lektsii.net - Лекции.Нет - 2014-2025 год. (0.007 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав