Основные операции
Рассмотрим способы обработки данных - для этого язык Си имеет широкий набор возможностей. Основные арифметическиеоперации: сложения, вычитания, умножения, деления. Операции в языке Си применяются для представления арифметических действий. Например, выполнение операции + приводит к сложению двух величин, стоящих слева и справа от этого знака. Рассмотрим операции =, +, -, *, /. В языке Си нет операции возведения в степень.
Операция присваивания "="
В языке Си знак равенства не означает "равно". Он означает операцию присваивания некоторого значения. С помощью оператора
переменной c именем year присваивается значение 2004, т.е. элемент слева от знака = - это имя переменной, а элемент справа - ее значение. Мы называем символ = операцией присваивания . В этой операции действие выполняется справа налево.
Возможно, различие между именем переменной и ее значением покажется незначительным? В таком случае давайте рассмотрим следующий оператор:
C математической точки зрения это бессмыслица. Если вы прибавляете единицу к конечному числу, результат не может быть равен исходному числу. Но как оператор присваивания данная строка имеет вполне определенный смысл, который можно выразить, например, такой фразой. Взять значение переменной с именем i, к нему прибавить 1, а затем присвоить новое значение переменной с именем i.
Оператор вида
на языке Си не имеет смысла, поскольку 2004 - число. Мы не можем присвоить константе какое-то значение; ее значением является она сама. Поэтому, помните, что элемент, стоящий слева от знака =, всегда должен быть именем переменной.Операнд - это то, над чем выполняются операции. Например, можно описать процесс "поедания" картошки как применения операции "поедание" к операнду "картошка".
Операция присваивания в языке Си представляется более интересной, чем в большинстве других языков. Рассмотрим простую программу:
/* таблица результатов по шахматам */
main( )
{
int l, m, n;
n=m=l=165;
printf("l m n\n");
printf("Счет первой партии %4d %8d %8d\n", l, m, n);
}
Присваивания выполняются справа налево: сначала переменная l получает значение 165, затем переменная m и наконец n. В языке Си имеется несколько других операций присваивания, которые отличаются от описанной операции. Их мы рассмотрим попозже.
Представим еще один пример простой программы:
/* использование операции присваивания */
main( )
{
/* переменные number, ouzo, cost инициализируются конкретными значениями*/
int number=5;
float ouzo=13.5;
int cost=31000;
printf("number ouzo cost\n");
printf("number=%d ouzo=%f cost=%d\n",
number, ouzo, cost);
}
Операция сложения: +
Выполнение операции + приводит к сложению двух величин, стоящих слева и справа от этого знака. Например, в результате работы оператора
на печать будет выведено число 165, а не выражение 100+65. Операнды могут быть как переменными, так и константами. Операция + называется "бинарной", или "диадической". Эти названия отражают тот факт, что она имеет дело с двумяоперандами.
Пример:
Переменной i присваивается значение переменной j плюс 2.
Операция вычитания: -
Выполнение операции вычитания приводит к вычитанию числа, расположенного справа от знака -, из числа, стоящего слева от этого знака. Оператор
присваивает переменной n значение 63.00.
Операция изменения знака: -
Знак минус используется для указания или изменения алгебраического знака некоторой величины. Например, в результате выполнения последовательности операторов
переменной get будет присвоено значение 15. Когда знак используется подобным образом, данная операция называется "унарной". Такое название указывает на то, что она имеет дело только с одним операндом.
Пример:
Операция изменяет алгебраический знак x.
Операция умножения: *
Операция умножения обозначается знаком *. При выполнении оператора
значение переменной x умножается на 3, и результат присваивается переменной z.
Операция деления: /
В языке Си символ / указывает на операцию деления. Величина, стоящая слева от этого знака, делится на величину, расположенную справа от этого знака. Например, в результате выполнения оператора
переменной l будет присвоено значение 63.0. Над данными целого типа операция деления производится не так, как над данными с плавающей точкой: в первом случае результат будет целым числом, а во втором - числом с плавающей точкой. В языке Си принято правило, согласно которому дробная часть у результата деления целых чисел отбрасывается. Это действие называется "усечением".
Рассмотрим пример, как выполняется усечение и чем деление целых чисел отличается от деления чисел с плавающей точкой:
main( )
{
printf("деление целых: 5/4 это %d \n", 5/4);
printf("деление целых: 6/3 это %d \n", 6/3);
printf("деление целых: 7/4 это %d \n", 7/4);
printf("деление чисел с плавающей точкой: 7./4. это %2.2f \n", 7./4.);
printf("смешанное деление: 7./4 это %2.2f \n", 7./4);
}
Последний пример на использование смешанных типов, т.е. деление вещественного числа на целое. Язык Си менее строго подходит к подобным вопросам и позволяет выполнять такие операции.
! |
Смешения типов следует избегать! |
Результат выполнения указанной программы:
деление целых: 5/4 это 1
деление целых: 6/3 это 2
деление целых: 7/4 это 1
деление чисел с плавающей точкой: 7./4. это 1.75
смешанное деление: 7./4 это 1.75
В результате деления целых чисел происходит отсечение дробной части. Когда мы смешиваем целые числа и числа с плавающей точкой, результат будет таким же, как если бы оба операнда были числами с плавающей точкой. В этом случае перед делением целое преобразуется в число с плавающей точкой. Для того чтобы понять, что происходит в тех случаях, когда в одном операторе используется несколько операций, рассмотрим порядок выполнения операций. Совершенно очевидно, что изменение порядка выполнения действий может приводить к различным результатам. В языке Си каждой операции назначается уровень старшинства. Умножение и деление имеют более высокий уровень, чем сложение и вычитание, поэтому они выполняются первыми. Если же две операции имеют один и тот же уровень старшинства, они выполняются в том порядке, в котором присутствуют в операторе. Для большинства операций обычный порядок - слева направо. Операция = является исключением из этого правила. Многие программисты предпочитают представлять порядок вычислений с помощью дерева выражений. Например, выражение
будет выглядеть так:
Мы можем составить таблицу правил описанных нами операций. В дальнейшем мы приведем таблицу, где содержатся правила, относящиеся ко всем операциям языка Си.
Таблица 1.1. Операции в порядке уменьшения уровня старшинства
Операции |
Порядок вычисления |
( ) |
слева направо |
- (унарный) |
слева направо |
* / |
слева направо |
+ - (вычитание) |
слева направо |
= |
справа налево |
|