Выражение – это комбинация операндов, знаков операций и круглых скобок, используемая для получения значения определенного типа. Операндом (участником операции) может быть константа, переменная, функция или другое выражение. Знаки операции определяют действия (элементарные операции) над операндами в порядке, заданном приоритетами операций и круглыми скобками, которые образуют вложенные подвыражения. Вычисление выражения начинается с самых внутренних скобок.
Унарные операции (с одним операндом) имеют приоритет над бинарными (с двумя операндами). Мультипликативные операции (умножение (*), деление (/), в том числе и деление нацело, деление по модулю (%)) старше аддитивных (сложение (+), вычитание (–)), за которыми идут операции отношения и логические операции [1, c.40].
Функции в выражении вычисляются для получения значения, участвующего в операции. Для использования стандартных математических функций в программе необходимо подключить их командой препроцессора
#include<math.h>.
|
|
Для аргументов функций, которые имеют тип:
int i; unsigned int u; double x, y;
наиболее используемы в выражениях следующие функции [1, c.48]:
sin(x) ~ sin x; cos(x) ~ cos x; tan(x) ~ tg x; acos(x) ~ arccos x; asin (x) ~ arcsin x; atan(x) ~ arctg x; fabs(x) ~ | x | для вещественного x (результат double); abs(i) ~ | i | - для целого i(результат int); log(x) ~ ln x; log10(x) ~ lg x; exp(x) ~ ex, где e – основание натурального логарифма (2.7); floor(x) ~ наибольшее целое число <= x (результат double); ceil(x) ~ наименьшее целое число >= x (результат double); srand(u) ~ инициализация генератора случайных чисел (результат double); rand ~ равномерное псевдослучайное число от 0 до 232-1 (результат int).
Общее правило вычисления выражения: перед вычислением все входящие в него переменные должны быть определены, то есть должны иметь численные значения.
По роли выполняемой в программе выражения можно разделить на арифметические и логические.
Арифметические выражения представляют собой запись на языке Си в одну строку математической формулы с учетом порядка вычисления выражения и старшинства операций с целью получения числового значения (целого или вещественного). Например,
математическая формула: | арифметическое выражение: |
a*sin(x)/sqrt(x*x+fabs(x-a)) | |
(a+b)/(2*p-q) | |
a/(-2) |
Выражение можно переносить на другую строку без повторения знака операций в отличие от записи математической формулы, но нельзя опускать знаки операций, аргумент функции заключается в круглые скобки:
a+b×sin t – -2cos t | a+b*sin(t) – 2*cos(t) |
Результат выражения определяется выполняемыми операциями с учетом преобразования типов операндов неявного (автоматического) и явного.
Неявное преобразование типов операндов осуществляет изменение типа участвующих в операциях операндов к типу операнда с наибольшим размером (“старший тип”). Перечислим типы данных, начиная со старшего:
|
|
long double – длинный вещественный с двойной точностью;
double – вещественный с двойной точностью;
float – вещественный;
unsigned long – длинный беззнаковый целый;
long int – длинный целый;
unsigned – беззнаковый целый;
int – целый;
char – символьный.
Пример. Для заданных описаний:
double p; unsigned char ch; unsigned long m; int i;
при вычислении выражения p*(i+ch/m) операнд сh преобразуется к типу unsigned long, к которому преобразуется также операнд i и результат в скобках, затем последний преобразуется к типу double и результат выражения будет иметь тип double.
Явное преобразование типа операнда осуществляется программистом с помощью операции вида
(тип) выражение,
если без такого преобразования результат выражения будет неверный.
Деление целых операндов дает результат целого типа, что может привести к неожиданным результатам.
Пример. Пусть описана переменная int k=7, тогда при вычислении выражения
k / 2 получим в результате 3, вместо ожидаемого 3.5.
Применив преобразование типа переменной k
(float) k / 2, получим результат 3.5.
Этот же результат можно получить, применяя смешанные (разного типа) операнды:
k / 2.0.