Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_по_пяву_4.doc
Скачиваний:
121
Добавлен:
15.03.2015
Размер:
1.29 Mб
Скачать
    1. Порядок вычисления выражений

Под порядком вычисления (order of evaluation) понимается порядок, в котором вычисляются значения отдельных членов выражения. В языке Си имеется небольшое количество операторов, для которых определен порядок вычисления операндов. К числу таких операторов относятся:

● логическое И (&&),

● логическое ИЛИ (||),

● тернарный оператор (?:),

● оператор запятая (,).

Для других операторов очередность вычисления операндов не определена. Например, при анализе выражения sin(x) + cos(x)нельзя ожидать, что вызов функцииsin(x)будет выполнен до вызова функции cos(x).

  1. Арифметические операторы и выражения

В языке Си имеется шесть унарных и пять бинарных арифметических операторов, показанных в приводимой ниже таблице. В таблице предполагается, что переменные iиnимеют целый тип, а переменные a и b – любой числовой тип.

Оператор

Назначение

Пример

+

Унарный плюс

+a

-

Унарный минус

-a

++

Две разновидности инкремента

++a (префиксный инкремент)

a++ (постфиксный инкремент)

--

Две разновидности декремента

--a (префиксный декремент)

a-- (постфиксный декремент)

+

Бинарное сложение

a + b

-

Бинарное вычитание

a – b

*

Умножение

a * b

/

Деление

a / b

%

Остаток от деления нацело

i % n

    1. Унарные операторы

Остановимся на отдельных операторах. Отметим, что унарный оператор “+” относится к категории программистских недоразумений. Этот оператор никаких полезных действий не выполняет. Дело в том, что значение выражения, содержащего этот оператор, совпадает со значением его операнда. Выражение, содержащее унарный оператор “-”, возвращает значение, отличающееся от операнда только знаком.

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

Приведем пример. Пусть имеется следующий фрагмент программы.

/* ..........................*/ intn = 5;intm = 5; printf(“++n=%d\n”, ++n); printf(“=%d\n”, n); printf(“m++=%d\n”, m++); printf(“m=%d\n”, m); /* ...........................*/

В результате выполнения рассматриваемого фрагмента программы вывод на экран дисплея будет иметь следующий вид:

++n=6 n=6 m++=5 m=6

В рассматриваемом примере к переменным “n” и “m”, имеющим равные значения, были применены различные формы инкремента. К переменной “n” была применена префиксная форма инкремента, а к переменной “m” – постфиксная форма. Окончательные значения рассматриваемых переменных оказались одинаковыми. Значения, возвращаемые в результате вычисления выражений ++n и m++, оказались разными. Выражение ++n вернуло новое значение своего операнда (с учетом побочного эффекта), а выражение m++ вернуло исходное значение своего операнда.