Урок 4.1. Арифметические операции
4.1. Арифметические операции
В качестве арифметических операций в Си используются следующие:
Таблица 5.1 Арифметические операции
Название арифметической операции | Знак операции в Си |
Сложение | + |
Вычитание | - |
Умножение | * |
Деление | / |
Деление по модулю | % |
Унарный плюс | + |
Унарный минус | - |
Операции таблицы 5.1 с первой по пятую являются бинарными, т.е. выполняются над парой данных. Операция "унарный минус" применима к одному операнду, например, можно записать выражение Си: -(delta+2.7)
Мы употребили термин "выражение". Понятие выражения в Си аналогично понятию выражения в других языках программирования. С точки зрения синтаксиса выражение состоит из операндов (переменных, констант, вызовов функций), связанных знаками операции и, по необходимости, круглыми скобками. Частным случаем выражения является константа или переменная, а также другой объект языка из рассматриваемых далее. Как уже указывалось, выражение, состоящее только из одних констант, называется константным выражением. Семантика выражения в каждом конкретном случае зависит от задачи пользователя, однако выражение всегда имеет значение, зависящее от данных и тех операций, которые к ним применялись в процессе вычисления значения.
Заслуживает внимания операция унарный плюс. Дело в том, что Си осуществляет перегруппировку выражений, пытаясь создать выражения эффективные для компиляции. Однако выражения с унарным плюсом не перегруппировываются. Учитывая наличие унарного плюса, можно записать, например, такое выражение: a++(b+с), которое гарантированно будет выполняться следующим образом: результат (b+c) будет прибавлен к значению а, хотя выражение, не использующее унарного плюса (а+(b+c)), может вычисляться, как (a+b)+c.
Вернемся к бинарным операциям. Операции +, -, *, / применимы ко всем основным типам данных, однако при делении целого на целое дробная часть отбрасывается. Например, выражение 5/2 имеет значение 2, а не 2.5. Чтобы получить точное значение при делении пятерки на двойку нужно это выражение записать так, чтобы хотя бы один из его операндов не был целого типа, например, 5/2.0 и 5.0/2 или 5.0/2.0. (см. 4.6. Преобразования типов).
Операция "взятие модуля" (%) дает остаток от деления. Например, 5%2 даёт 1, а 13%9 даёт 4. Выражение x%y будет иметь значение нуль, если х точно делится на у. Операцию % нельзя применять для данных типа float и double. Примеры:
10 % 2 == 0
9 % 2 == 1
10 % 3 == 1
11 % 3 == 2
3 % 11 == 3
При вычислении значения выражения порядок выполнения операций определяется их приоритетами. Перечислим арифметические операции в порядке убывания их приоритетов:
- унарный плюс(+);
- унарный минус(-);
- умножение(*), деление(/), взятие модуля(%);
- сложение(+), вычитание(-).
Таким образом, среди арифметических операций наивысший приоритет имеют унарные операции и самый низкий операции сложения и вычитания. Операции одного приоритета, следующие подряд выполняются слева направо. (см. 4.10. Приоритеты операций)
Как и в большинстве языков программирования, в Си для определения необходимой последовательности вычисления значения выражения можно использовать круглые скобки. Причем в Си использование круглых скобок трактуется как операция группирование, имеющая наивысший приоритет среди всех операций Си. Однако для ассоциативных и коммутативных операций ( среди арифметических это * и +) порядок вычисления не определяется, и компилятор может переупорядочить вычисления даже при наличии скобок. Например, об этом уже говорилось, a+(b+c) может вычисляться как (a+b)+c. Это редко приводит к различным результатам, но если обязательно нужен определенный порядок, то следует явно использовать промежуточные переменные.
Примеры записи арифметических выражений:
3.14 /(х+y) * c
0.1е-6 + z – x * (m + k + (m * n))* d
sin(x) + log(x+1)- exp(x) * pow(x,2)
В заключение этого раздела обращаем внимание на отсутствие в языке Си операции возведения в степень. Возведение в степень реализуется встроенной функцией pow(). Прототипы математических функций Си содержатся в include файле math.h.
Примеры некоторых встроенных функций языка:
abs( a ) | модуль или абсолютное значение от а | abs(-3.0)=3.0 |
sqrt(a) | корень квадратный из а, причём а не отрицательно | sqrt(9.0)=3.0 |
pow(a, b) | возведение а в степень b | pow(2,3)=8 |
ceil( a ) | округление а до наименьшего целого, но не меньше чем а | ceil(2.3)=3.0 ceil(-2.3)=-2.0 |
floor(a) | округление а до наибольшего целого, но не больше чем а | floor(12.4)=12 floor(-2.9)=-3 |
fmod(a, b) | вычисление остатка от a/b | fmod(4.4, 7.5) = 4.4 fmod( 7.5, 4.4) = 3.1 |
exp(a) | вычисление экспоненты еа | exp(0)=1 |
sin(a) | a задаётся в радианах | |
cos(a) | a задаётся в радианах | |
log(a) | натуральный логарифм a(основанием является экспонента) | log(1.0)=0.0 |
log10(a) | десятичный логарифм а | Log10(10)=1 |
asin(a) | арксинус a, где -1.0 < а < 1.0 | asin(1)=1.5708 |
Оставить комментарий