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