Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
л_4_Операции_и_выражения.doc
Скачиваний:
10
Добавлен:
05.11.2018
Размер:
660.99 Кб
Скачать

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

1. Внимание !!! Иногда при смешивании в одном выражении операндов разных арифметических типов могут получиться «неожиданные» результаты. Например:

int main()

{

int a=8, b=5;

double var1, var2;

var1 = a/b; // 1, т.к. выполняется целочисленное деление

var2 = (double)a/b; //результат имеет ожидаемое значение1.6

cout << var1 << " " << var2 << endl;

_getch();

return 0;

}

2. Особенности преобразования типов int и double:

int main()

{double d=3.2, x;

int i=2, j;

x = (j = d/i)*2; // i преобразуется к типу double, результат деления = 1.6

// при присваивании j значение 1.6 усекается до 1

printf ("x=%f\t, j=%d\n", x, j); // х=2.000000, j=1

j=(x=d/i)*2; //i преобразуется к типу double, результат деления = 1.6

printf ("x=%f\t, j=%d\n", x, j); // x=1.600000 j=3 (3.2 усекается при присваивании до 3)

j=d*(x=2.5/d); //правая часть выражения для j получит значение 2.5

//усекается при присваивании до 2

printf ("j=%d\n", j); // j=2

x=d*(j=((int)2.9+1.1)/d); // значение выражения ((int)2.9+1.1) равно 3.1

// значение выражения ((int)2.9 + 1.1)/d) < 1 и при присваивании j усекается до 0

printf ("x=%f\t, j=%d\n", x, j); //значит x=0.000000, j=0

_getch();

return 0;

}

3. Чтобы вывести на экран код символа, нужно применить операцию явного преобразования. Например:

int main()

{ char c= 'a';

cout << (unsigned) c << endl; // будет напечатан код символа 97

_getch();

return 0;

}

4. Переменной перечислимого типа нельзя присвоить значение с помощью оператора ввода. Однако можно ввести значение для переменной целого типа и воспользоваться далее приведением типа:

enum Predmet {alg, geom, progr, analiz};

int main() {

Predmet pred (progr);

cout << pred << endl; // 2 - внутреннее представление переменной

int i=3;

pred = (Predmet) i; // преобразование к перечислимому типу

cout << pred << endl; // 3 - внутреннее представление

// нового значения переменной

_getch();

return 0;

}

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

pred = (Predmet)3;

5. Функциональная форма преобразования типа – требуемый_тип (аргумент) – не может применяться для типов со сложным наименованием (например, unsigned long (x/3+2) вызовет ошибку компиляции).

В таком случае удобно использовать форму (требуемый_тип) аргумент или выполнять явное преобразование с помощью typedef:

Например, если имеем:

typedef unsigned long UL;

typefef char * PCH;

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

UL (x/3+2) или PCH(0777);

6. Приведение типов может быть полезным при работе с условными операторами. Сравните приведенные ниже выражения (они на самом деле решают одну задачу):

if (x > 15) x = x – 15;

x =x – 15 * (unsigned) (x > 15);