- •Лекция 4 Операции и выражения
- •Понятие выражения и операции
- •Классификация операций
- •Приоритеты (ранги) операций
- •Арифметические операции
- •Примеры использования арифметических операций Выделение цифр в целом числе
- •Выделение цифр в вещественном числе
- •Арифметические операции над переменными символьного типа
- •Операции инкремента и декремента
- •Особенности выполнения операций инкремента и декремента
- •Операции присваивания
- •Примеры использования
- •Операции отношения
- •Логические операции
- •Особенности выполнения логических операций
- •Примеры использования логических операций
- •Логические выражения и примеры их записи
- •Поразрядные логические операции
- •Примеры выполнения поразрядных логических операций:
- •Операции поразрядного сдвига
- •Дополнительные операции Операции доступа к компонентам структурированного объекта
- •Операции доступа к адресуемым компонентам классов
- •Определение размера sizeof
- •Вызов функции ( )
- •Индексация [ ]
- •Операция запятая ,
- •Операция расширения области видимости ::
- •Преобразование типа
- •Правила преобразования типов
- •Примеры преобразования типов
- •2. Особенности преобразования типов int и double:
- •7. Проанализируйте преобразование типов в операторах присваивания:
- •8. Приведение типа в случае использования указателей:
- •9. Преобразование старшего типа к младшему удобно использовать для выделения отдельных частей переменной или константы:
- •10. С помощью приведения типа можно получить дробную часть числа:
- •Программирование вычисления алгебраических выражений
- •Определение первого символа вводимого значения
- •Контроль правильности ввода значения переменной
- •Основные встроенные (стандартные) функции
- •Пример вычисления по формуле
- •Замечания по программированию алгебраических выражений
- •Особенности представления чисел по двоичному основанию*
- •Особенности выполнения арифметических операций над вещественными числами*
- •Операции умножения и деления
- •Операции сложения и вычитания
- •Особые ситуации Ошибки округления
- •Ошибки переполнения
- •Потеря (исчезновение) порядка
- •Катастрофическая потеря порядка
- •Потеря значащих цифр
- •Особенности выполнения операций отношения (сравнения)
- •Обратить внимание
- •Правила работы с данными вещественных типов
Примеры преобразования типов
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); |