Читайте также:
|
|
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); |
7. Проанализируйте преобразование типов в операторах присваивания:
int main()
{double d; float f; long l; short sh;
sh = l= f = d = 100/3; //целое деление, т.к. числа без точки
//присваивание выполняется справа налево
printf ("d=%lf\t", d); // 33.000000
printf ("f=%f\t", f); // 33.000000
printf ("l=%d\t", l); // 33
printf ("sh=%d\t\n", sh); // 33
d = f= l = sh = 100/3; //целое деление
printf ("sh=%d\t", sh); // 33
printf ("l=%d\t", l); // 33
printf ("f=%f\t", f); // 33.000000
printf ("d=%lf\t\n", d); // 33.000000
sh = l= f = d = 100/3.; //деление с плавающей точкой
printf ("d=%lf\t", d); // 33.333333
printf ("f=%f\t", f); // 33.333332
printf ("l=%d\t", l); // 33
printf ("sh=%d\t\n", sh); // 33
d = f= l = sh = (double)100/3; // целое деление, приведение типа к double
printf ("sh=%d\t", sh); // 33
printf ("l=%d\t", l); // 33
printf ("f=%f\t", f); // 33
printf ("d=%lf\t\n", d); // 33
sh = l= f = d = (double)(100000/3); // целое деление, приведение типа к double
printf ("d=%lf\t", d); // 33333
printf ("f=%f\t", f); // 33333
printf ("l=%d\t", l); // 33333
printf ("sh=%d\t\n", sh); //-32203 число не попадает в диапазон типа!!
d = f= l = sh = 100000/3; //целое деление
printf ("sh=%d\t", sh); //-32203 число не попадает в диапазон типа!!
printf ("l=%d\t", l); // все остальные присваивания будут неверны
printf ("f=%f\t", f);
printf ("d=%lf\t\n", d);
_getch();
return 0;
}
8. Приведение типа в случае использования указателей:
// (пример пока сложный для понимания)
int main() {
unsigned long block = 0xffeeddccL; // область памяти из 4-х байтов
void *ptr = █ //указатель на начало области
unsigned char ch;
unsigned short two_bytes;
unsigned long four_bytes;
//адрес переменной определяется адресом ее младшего байта
ch = *(unsigned char*) ptr; // взятие значения по адресу (1 байт)
printf ("%x\n", ch); // cc
two_bytes = *(unsigned short*) ptr; //взятие значения по адресу (2 байта)
printf ("%x\n", two_bytes); // ddcc
four_bytes = *(unsigned long *) ptr;; //взятие значения по адресу (4 байта)
printf ("%x\n", four_bytes); // ffeeddcc
_getch();
return 0;
}
Дата добавления: 2015-07-08; просмотров: 150 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Правила преобразования типов | | | Адрес переменной |