- •Лекция 4 Операции и выражения
- •Понятие выражения и операции
- •Классификация операций
- •Приоритеты (ранги) операций
- •Арифметические операции
- •Примеры использования арифметических операций Выделение цифр в целом числе
- •Выделение цифр в вещественном числе
- •Арифметические операции над переменными символьного типа
- •Операции инкремента и декремента
- •Особенности выполнения операций инкремента и декремента
- •Операции присваивания
- •Примеры использования
- •Операции отношения
- •Логические операции
- •Особенности выполнения логических операций
- •Примеры использования логических операций
- •Логические выражения и примеры их записи
- •Поразрядные логические операции
- •Примеры выполнения поразрядных логических операций:
- •Операции поразрядного сдвига
- •Дополнительные операции Операции доступа к компонентам структурированного объекта
- •Операции доступа к адресуемым компонентам классов
- •Определение размера sizeof
- •Вызов функции ( )
- •Индексация [ ]
- •Операция запятая ,
- •Операция расширения области видимости ::
- •Преобразование типа
- •Правила преобразования типов
- •Примеры преобразования типов
- •2. Особенности преобразования типов int и double:
- •7. Проанализируйте преобразование типов в операторах присваивания:
- •8. Приведение типа в случае использования указателей:
- •9. Преобразование старшего типа к младшему удобно использовать для выделения отдельных частей переменной или константы:
- •10. С помощью приведения типа можно получить дробную часть числа:
- •Программирование вычисления алгебраических выражений
- •Определение первого символа вводимого значения
- •Контроль правильности ввода значения переменной
- •Основные встроенные (стандартные) функции
- •Пример вычисления по формуле
- •Замечания по программированию алгебраических выражений
- •Особенности представления чисел по двоичному основанию*
- •Особенности выполнения арифметических операций над вещественными числами*
- •Операции умножения и деления
- •Операции сложения и вычитания
- •Особые ситуации Ошибки округления
- •Ошибки переполнения
- •Потеря (исчезновение) порядка
- •Катастрофическая потеря порядка
- •Потеря значащих цифр
- •Особенности выполнения операций отношения (сравнения)
- •Обратить внимание
- •Правила работы с данными вещественных типов
9. Преобразование старшего типа к младшему удобно использовать для выделения отдельных частей переменной или константы:
int main(){
unsigned long f = 0x12345678;
unsigned short of, s;
of = f; //результат приведения типа – только 2 младших байта
s = f >> 16;
printf("%x \n %x \t %x \n", f, s, of);
_getch();
return 0;
}
//вывод на экран: 12345678
1234 5678
31 16 5 0
10. С помощью приведения типа можно получить дробную часть числа:
double value, int_value, frac_value;
frac_value = value - int(value); или
frac_value = value - static_cast<int>(value);
11. При вычислении алгебраических выражений возможны случаи выхода за пределы значений типа. В таком случае поможет приведение типа:
//пример а)
int main(){
int signedVar = 1500000000; //значение signed int должно быть <=2 147 483 647
unsigned int unsignVar = 1500000000;
//значение unsigned int должно быть <=4 294 967 295
signedVar = (signedVar * 2) / 3; //значение превышает диапазон signed int
unsignVar = (unsignVar * 2) / 3; //значение не превышает диапазона unsigned int
cout << "signedVar = " << signedVar << endl; //неверное значение
cout << "unsignVar = " << unsignVar << endl; //OK
_getch();
return 0;
}
Результаты работы:
signedVar = -431655765
unsignVar = 1000000000
//пример в)
int main(){
int intVar = 1500000000; //1,500,000,000
intVar = (intVar * 10) / 10; //значение больше 2 147 483 647
cout << "intVar = " << intVar << endl; //неверное значение
intVar = 1500000000;
intVar = (static_cast<double>(intVar) * 10) / 10; //приведение типа cout << "intVar = " << intVar << endl; //верное значение
_getch();
return 0;
}
Результаты работы:
intVar = 211509811 неверный ответ
intVar = 1500000000 верный ответ
12. Обратите внимание на неявное преобразование типов signed char и unsigned char в следующих выражениях (напомним, что для типа char значения, большие 127, представляются отрицательными числами):
int main(){
char c = 0;
unsigned char cs = 239;
int i = cs;
cout << cs <<" " << i << endl; // я 239 (11101111 в 2с/с)
i = c = cs;
cout << c << " " << i << endl; // я -17 (11101111 в 2с/с)
c = -30; cs = 0; i = c;
cout << c << " " << i << endl; // т -30 (11100010 в 2с/с)
i = cs = c;
cout << cs << " " << i << endl; // т 226 (11100010 в 2с/с)
_getch();
return 0;
}
13. Не надо смешивать в выражениях типы int и unsigned. Обратите внимание на неявное преобразование типов int и unsigned:
unsigned ui=1;
int i=-1;
cout << i- ui << endl; //4294967294, а не -2 , переменная целая //подтягивается до беззнаковой
// исправит положение следующий оператор
cout << i- static_cast<int>(ui) << endl; //-2