![](/user_photo/2706_HbeT2.jpg)
- •Лекция 4 Операции и выражения
- •Понятие выражения и операции
- •Классификация операций
- •Приоритеты (ранги) операций
- •Арифметические операции
- •Примеры использования арифметических операций Выделение цифр в целом числе
- •Выделение цифр в вещественном числе
- •Арифметические операции над переменными символьного типа
- •Операции инкремента и декремента
- •Особенности выполнения операций инкремента и декремента
- •Операции присваивания
- •Примеры использования
- •Операции отношения
- •Логические операции
- •Особенности выполнения логических операций
- •Примеры использования логических операций
- •Логические выражения и примеры их записи
- •Поразрядные логические операции
- •Примеры выполнения поразрядных логических операций:
- •Операции поразрядного сдвига
- •Дополнительные операции Операции доступа к компонентам структурированного объекта
- •Операции доступа к адресуемым компонентам классов
- •Определение размера sizeof
- •Вызов функции ( )
- •Индексация [ ]
- •Операция запятая ,
- •Операция расширения области видимости ::
- •Преобразование типа
- •Правила преобразования типов
- •Примеры преобразования типов
- •2. Особенности преобразования типов int и double:
- •7. Проанализируйте преобразование типов в операторах присваивания:
- •8. Приведение типа в случае использования указателей:
- •9. Преобразование старшего типа к младшему удобно использовать для выделения отдельных частей переменной или константы:
- •10. С помощью приведения типа можно получить дробную часть числа:
- •Программирование вычисления алгебраических выражений
- •Определение первого символа вводимого значения
- •Контроль правильности ввода значения переменной
- •Основные встроенные (стандартные) функции
- •Пример вычисления по формуле
- •Замечания по программированию алгебраических выражений
- •Особенности представления чисел по двоичному основанию*
- •Особенности выполнения арифметических операций над вещественными числами*
- •Операции умножения и деления
- •Операции сложения и вычитания
- •Особые ситуации Ошибки округления
- •Ошибки переполнения
- •Потеря (исчезновение) порядка
- •Катастрофическая потеря порядка
- •Потеря значащих цифр
- •Особенности выполнения операций отношения (сравнения)
- •Обратить внимание
- •Правила работы с данными вещественных типов
Замечания по программированию алгебраических выражений
-
Не забываем включать требуемые заголовочные файлы.
-
При программировании больших формул придерживаемся подхода «здравого смысла», т.к. запись формулы в виде одного выражения чревата появлением ошибок (как правило, несоответствие открывающих и закрывающих скобок), а введение большого числа дополнительных переменных для сохранения промежуточных результатов – также не лучший выход.
-
При форматном выводе с помощью функции printf необходимо внимательно относиться к заданию спецификатора. Например, для переменной, определенной как double df; запись оператора вывода в виде printf(“%d”, df) или printf(“%d”, df) даст неверный результат.
-
При форматном вводе с помощью функции scanf необходимо не забывать указывать адрес вводимой переменной (например, &x).
-
При использовании функции pow для извлечения корня некоторой, (например, 4-ой степени) из выражения (например, a+b*b) помнить, что запись вида pow (a+b*b, 1/4) всегда даст значение, равное 1 из-за целочисленного деления 1 на 4. Исправить положение поможет запись степени в виде 1.0/4 или 1/4.0 или 1.0/4.0 или 0.25
-
Заменяем умножением возведение выражений в небольшую степень (в том числе и значений, возвращаемых функциями), стараемся не использовать в таком случае функцию pow.
-
Замена деления умножением дает выигрыш в скорости (A/5.0 A*0.2)
-
Число в целой степени вычисляется быстрее, чем число в вещественной степени.
-
Не путаем операции = и ==.
-
Для повторяющихся выражений в формуле делаем предварительную замену этих выражений на некоторую переменную.
-
Не забываем о приоритете операций.
-
Литералы в инициализирующих выражениях должны иметь тип, соответствующий типу инициализируемой переменной (double А=0 менее эффективно, чем double А=0.0lf; double Y=1/x менее эффективно, чем double Y=1.0/x.
-
В выражениях операнды одного типа стараемся группировать вместе.
-
Невозможно определить порядок обработки операндов в коммутативных операциях: например: int z, x=1; z=(x*5) +((x=10)/2); z может получить различные значения в зависимости от того, какое выражение в скобках будет вычисляться первым; во избежание двусмысленности следует использовать промежуточную переменную: int z, t, x=1; t=x*5; z=(x*5) +((x=10)/2);
-
Следим за наличием точки с запятой перед второй частью (else) условного оператора if.
-
Если в какой-либо ветви условия необходимо выполнить более одного оператора, их следует объединить в один блок с помощью фигурных скобок.
-
Если в операторе вывода в поток используется тернарная операция, то тернарное выражение полностью заключается в скобки.
-
При вводе значения любого из целочисленных типов, превосходящего максимально допустимое значение для диапазона типа соответствующей переменной, фактически вводится неверное значение. Чтобы обнаружить ошибку, необходимо контролировать вводимые данные.
Особенности представления чисел по двоичному основанию*
Особенность представления чисел по двоичному основанию – это невозможность, как правило, осуществления точного перевода числа в двоичную систему счисления, что определяет как бы первый уровень возможных ошибок в представлении числа. Например, число 0.5 переводится в 2-ичную систему «точно»: 0.5 10 = 0.1 2 . Число 0.1 точного перевода не имеет, и его значение определяется лишь заданной точностью (количеством получаемых цифр): 0.1 10 = 0.1FFF16 = 0.000111111111 2.