Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы программирования на языке C_4.docx
Скачиваний:
43
Добавлен:
25.03.2016
Размер:
299.55 Кб
Скачать

Дополнительные операции

В языке Си имеется около сорока операций. Те операции, которые мы рассмотрели, являются наиболее общеупотребительными. Рассмотрим еще три операции, наиболее используемые программистами.

Операция деления по модулю: %

Эта операция используется в целочисленной арифметике. Ее результатом является остаток от деления целого числа, стоящего слева от знака операции, на число, расположенное справа от нее. Например, 63%5, читается как 63 по модулю 5, имеет значение 3, т.к. 63=12*5+3.

В результате выполнения оператора

minutes=time%60;

переменной minutes будет присвоено значение остатка от деления time на 60.

Операция увеличения: ++

Операция увеличения осуществляет следующее простое действие: она увеличивает значение своего операнда на единицу. Существуют две возможности использования данной операции: первая, когда символы ++ находятся слева от переменной ( операнда ), - "префиксная" форма, и вторая, когда символы ++ стоят справа от переменной, - "постфиксная" форма. Эти две формы указанной операции различаются между собой только тем, в какой момент осуществляется увеличение операнда. Префиксная форма изменяет значение операнда перед тем, как операнд используется. Постфиксная форма изменяет значение после того как операнд использовался.

В примере,

j=i++;

переменной j сначала присваивается значение i, затем значение переменной i увеличивается на 1.

Операция уменьшения: --

Каждой операции увеличения соответствует некоторая операция уменьшения, при этом вместо символов ++ мы используем --. Когда символы -- находятся слева от операнда - "префиксная" форма операции уменьшения. Если символы -- стоят справа от операнда - это "постфиксная" форма операции уменьшения.

В соответствии с принятым в языке Си порядком вычислений операции увеличения и уменьшения имеют очень высокий уровень старшинства. Только круглые скобки обладают более высоким приоритетом. Поэтому выражение a/b++ означает (a)/(b++), а не (a/b)++.

!

Не применяйте операции увеличения или уменьшения к переменной, присутствующей в более чем одном аргументе функции. Не применяйте операции увеличения или уменьшения к переменной, которая входит в выражение более одного раза.

Перечень операций языка Си

Рассмотрим множество операций языка Си. Описанные операции входят в это множество. Язык Си отличается их большим разнообразием. В этом разделе будет обсуждаться их семантика. Каждая операция характеризуется уровнем приоритета и порядком, в котором эти операции выполняются - слева направо или справа налево. Если все операции выражения имеют один и тот же уровень приоритета, то значение выражения вычисляется слева направо в соответствии с порядком выполнения операций. Все операции с одним и тем же уровнем приоритета имеют один и тот же порядок. Однако, если в выражении имеются операции с различными уровнями приоритета, то сначала выполняются операции с наивысшим уровнем приоритета, затем - следующего за ним приоритета и так далее в порядке убывания приоритета. Операции одного уровня приоритета выполняются в последовательности, указанной их порядком.

Операции, уровень приоритета которых равен 1

Операции вызова функции, индексирования и выбора. В качестве операций языка Си рассматриваются также скобки в вызове функции, квадратные скобки для индексирования массивов, точка и стрелка вправо для выбора компонентов структуры или объединения. Уровень этих операторов равен 1, все операции выполняются слева направо.

Операция вызова функции: ( )

Пример 1:

fe(e1, e2,...,en);

Вызов функции fe с аргументами e1, e2, ..., en. Значением этого выражения является значение, которое возвращает функция.

Пример 2:

x = sqrt (y);

Операция индексирования массива: []

Синтаксис:

array [2]

Значением выражения является третий элемент массива.

Присвоение значения 26 одиннадцатому элементу массива записывается таким образом:

array[10]=26;

Первый элемент массива описывается выражением array[0] (более подробно о массивах описано в лекции 12).

Операция выбора компонентов структуры или объединения: .

Синтаксис:

struct.element

Значением этого выражения является элемент element структуры struct или объединения (см. лекцию 14). Оператор:

struct.element=1963;

присваивает значение 1963 этому элементу.

Операция выбора компонентов структуры с указателем: ->

Синтаксис:

my_birthday->day,

my_birthday - указатель на структуру. Оператор:

my_birthday->day=26;

присваивает значение 26 структурной переменной day, на которую указывает my_birthday.

Операции, уровень приоритета которых равен 2

Унарные операции. Для унарных операций требуется только один операнд ; эти операции либо префиксные, либо постфиксные. Операция sizeof имеет два варианта: префиксная операция и унарная операция.

Операция косвенной ссылки: *

Это указатель на любой тип T, кроме void. Тип результата T.

Использование:

*pe

Значением выражения является переменная, адресуемая указателем pe.

Пример 1:

*ptr=c;

Пример 2:

*fpe;

Значением выражения является функция, адресуемая указателем fpe.

Пример 3:

fpe=*funcname;

(*fpe)(arg1, arg2);

Операция получения адреса: &

У этой операции тип операнда есть переменная любого типа, кроме void. Тип результата - указатель на Т.

Использование:

&v

Значением выражения является адрес переменной v.

Пример:

myptr=&n;

Операция отрицания: -

Тип операнда - арифметический. Тип результата: unsigned, long, double, int.

Операция логического отрицания: !

Тип операнда - арифметический или указатель. Тип результата - int. Если операнд равен 0, то результат равен 1 и наоборот.

Пример:

if(!good) printf("not good");

Операция дополнения до 1: ~

Тип операнда - интегральный. Тип результата: int, long, unsigned.

Пример:

opposite=~mask;

Дополнение до единицы значения mask. Результат присваивается переменной opposite.

Операция увеличения: ++

Тип операнда - арифметический или указатель. Тип результата: int, unsigned, long, double, указатель. Значение операнда увеличивается, и становится новым значением операнда. Значение указателя увеличивается на величину указываемого объекта, значения других операндов увеличиваются на единицу.

Операция увеличения, постфиксная: ++

Тип операнда - арифметический или указатель. Тип результата: int, unsigned, long, double, указатель. Значение операнда увеличивается, но возвращается старое значение операнда. Значение указателя увеличивается на величину указываемого объекта, другие операнды увеличиваются на единицу.

Использование:

iv++

Увеличение iv на 1. Значением этого выражения является значение iv до увеличения.

Пример:

j=i++;

Использование:

pv++;

Увеличение указателя pv на 1, так что он будет указывать на следующий объект того же типа. Значением этого выражения является значение pv до увеличения.

Пример:

*ptr++=0;

Присвоить значение 0 переменной, на которую указывает ptr, затем увеличить значение указателя ptr так, чтобы он указывал на следующую переменную того же типа.